在C++的编译时将输出目标名称检索为字符串

All*_*ite 6 c++ macros gcc visual-studio visual-c++

我有一个项目,可以在多个平台上编译...... Windows,Unix,Linux,SCO,命名你的风味.

我想将输出目标的名称填入项目源代码中的变量(输出程序的名称,DLL,SO库或其他),所以我可以在消息中使用它作为引用组件名称的通用方法Windows上的EXE,DLL,Unix上的SO库等.

我正在考虑的是像FUNCTION _ 这样的预处理器密钥,但是在Visual C++中将Windows上的EXE/DLL的名称拉出来,然后是GCC中的SO输出库.当然,这些可能是两种不同的机制,但我想把这两种机制合并为一个选项,我可以在我的多平台代码中使用.

所以我可以调用一个宏观的东西,或者至少在编译期间选择Windows输出文件名(Visual C++),这样我就可以将它推入代码中的const字符串,也许是一种方法来做同样的事情. GCC因此可以将两个平台包装成单个抽象.最好不要在运行时拾取,但在编译期间捕获并保留.

如果输出是库,那么它的lib文件名.如果它是一个组件,那么输出组件文件名.

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

Ada*_*eld 9

如果一个项目下的所有内容都在一起,则可以使用预处理器宏.要在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 $@
Run Code Online (Sandbox Code Playgroud)

这允许您的源文件使用宏PROGRAM_NAME,"myapplication"在这种情况下将扩展为常量字符串.

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

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