gpt4 book ai didi

c++ - 在 C++ 中的编译时检索输出目标名称作为字符串

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:23 24 4
gpt4 key购买 nike

我有一个在多个平台上编译的项目...Windows、Unix、Linux、SCO,说出你喜欢的风格。

我想将输出目标的名称填充到项目源代码中的一个变量中(输出程序的名称、DLL、SO 库或其他任何名称),以便我可以在消息中使用它作为引用组件的通用方式命名为 Windows 上的 EXE、DLL、Unix 上的 SO 库等。

我在想的是像 FUNCTION_ 这样的预处理器键,但是可以在 Visual C++ 中提取 Windows 上的 EXE/DLL 的名称,然后是 GCC 中的 SO 输出库。当然,这可能是两种不同的机制,但我想将两者合并为一个选项,我可以在我的多平台代码中通用地使用它。

所以一个类似宏的东西或我可以调用的东西,它至少在编译过程中获取 Windows 输出文件名(Visual C++),这样我就可以将它插入代码中的常量字符串中,也许还有一种方法可以做到在 GCC 中也有同样的事情,所以这两个平台可以被包装成一个单一的抽象。最好不要在运行时获取,而是在编译期间捕获并保留。

如果输出是一个库,那么它就是 lib 文件名。如果是组件,则输出组件文件名。

我希望 Boost 或 Poco 必须已经有类似这样的东西,可能有一些不受支持的端点,这很好。

最佳答案

如果一切都在一个项目下,您可以使用预处理器宏。要在 Visual Studio 中执行此操作,请打开项目属性并转到配置属性 > C/C++ > 预处理器,然后将类似 PROGRAM_NAME="\"$(ProjectName)\"" 的内容添加到预处理器定义字段(对应于 /Dfoo=bar 编译器选项)。

对于 GCC,使用类似的 -Dfoo=bar 命令行选项。例如,您的 Makefile 可能看起来像这样:

PROGRAM_NAME = myapplication
CFLAGS += '-DEXECUTABLE_NAME="$(PROGRAM_NAME)"'

# Rule to make the executable from the object files
$(PROGRAM_NAME): $(OBJS)
$(LD) $(OBJS) -o $@ $(LDFLAGS)

# Rule to make object files from C source files
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@

这允许您的源文件使用宏 PROGRAM_NAME,在本例中它将扩展为常量字符串 "myapplication"

但是,如果您有被链接到多个程序的目标文件(例如,您有许多共享库代码可以由主程序驱动程序或各种测试套件运行),那么目标文件不能提前知道他们链接到哪个可执行文件,因此他们必须在运行时确定这一点。

在那种情况下,使用常量全局变量来存储程序名称,并使用上述技术在每个可执行文件的主源文件中定义和初始化它。

关于c++ - 在 C++ 中的编译时检索输出目标名称作为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5197683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com