Makefile 获取已定义变量的值

Makefile 获取已定义变量的值,makefile,preprocessor,Makefile,Preprocessor,我正试图编写一个makefile来自动化编译工作,将代码推送到服务器,并一次运行代码 问题是我没有定义一个服务器列表,而且会有其他人使用这个makefile 我想做的是以下几点 #include<stdio.h> #define SERVER1 //This might change to server2 #ifdef SERVER1 #define SERVER_NAME "Some Server 1" #endif #ifdef SERVER2 #define SERVER_NA

我正试图编写一个makefile来自动化编译工作,将代码推送到服务器,并一次运行代码

问题是我没有定义一个服务器列表,而且会有其他人使用这个makefile

我想做的是以下几点

#include<stdio.h>
#define SERVER1 //This might change to server2
#ifdef SERVER1
#define SERVER_NAME "Some Server 1"
#endif
#ifdef SERVER2
#define SERVER_NAME "Some Server 2"
#endif

int main(int argc, char** argv)
{
   //Some random code
}
假设有一个c代码

#include<stdio.h>
#define SERVER_NAME "Some Server"

int main(int argc, char** argv)
{
   //Some random code
}
我知道我总是可以对文件执行grep并提取变量,但我还想处理以下情况

#include<stdio.h>
#define SERVER1 //This might change to server2
#ifdef SERVER1
#define SERVER_NAME "Some Server 1"
#endif
#ifdef SERVER2
#define SERVER_NAME "Some Server 2"
#endif

int main(int argc, char** argv)
{
   //Some random code
}

我知道C预处理器功能强大,足以完成这项工作,但我无法确定要传递给它的参数或开关。

gcc预处理器选项允许您扫描源文件中的宏,而忽略其其余部分

假设您的源文件名为foo.cc:

编写另一个名为serverReporter.cc的源代码:

然后运行它


可能有一种方法来获取宏值而不运行代码,比如用-DD选项,但我还没有得到它的工作。

< P>假设你的头文件没有声明任何其他常数,对于C++代码来说可能是一个拉伸,你可以编译这样的文件:

// Comes from a header file
#define SERVER_NAME "server name"

const char compile_time_server_name[] = SERVER_NAME;
结果对象文件的常量数据部分将包含该字符串。例如,如果您的目标是ELF,则可以使用binutils中的objcopy来提取此数据:

objcopy -O binary -j .rodata server_name.o server_name.contents
命令xxd server_name.contents显示:

00000000: 7365 7276 6572 206e 616d 6500            server name.

注意后面的NUL;您可能需要通过进一步编写脚本来删除它。检查boject文件在.rodata部分中是否只包含一个符号可能是一个好主意,也许可以使用nm.

很好的答案,但是编译器会根据服务器选择进行更改。我的一些服务器可能运行的不是编译系统正在运行的东西。我还是会尝试一下。虽然-imacros的想法很好,但对我来说没有多大用处。虽然你的评论确实让我去了research-dD,也让我去了-dM-dM做了这个把戏,对我来说已经足够好了。@Nitro:太好了!我尝试了-dM,但无法使其工作。
g++ -imacros foo.cc serverReporter.cc -o serverReporter
// Comes from a header file
#define SERVER_NAME "server name"

const char compile_time_server_name[] = SERVER_NAME;
objcopy -O binary -j .rodata server_name.o server_name.contents
00000000: 7365 7276 6572 206e 616d 6500            server name.