获取定义变量的值

Get the value of a defined variable

我正在尝试编写一个 makefile 来自动执行编译工作,将代码推送到服务器,然后 运行 将代码合而为一。

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

我正在尝试做的是以下内容。

假设有一个代码c代码

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

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

有没有我可以在 makefile 中使用的工具,我会将 C 文件及其所有依赖项传递给它,该工具会告诉我(找不到更好的词)变量是什么 "SERVER_NAME" 定义为?

我需要这种东西

<Some tool> <c file initially created> <all include files> <any c specific switch>

输出类似于

SERVER_NAME="Some Server"

我知道我总是可以对文件执行 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 预处理器选项 -imacros 允许您扫描源文件中的宏并忽略其余部分。

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

#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
}

写另一个来源 serverReporter.cc:

#include <iostream>
using std::cout;
using std::endl;

int main()
{
  cout << "SERVER_NAME=" << SERVER_NAME << endl;
  return 0;
}

现在构建(有或没有 Make):

g++ -imacros foo.cc serverReporter.cc -o serverReporter

和运行它。

(可能有一种方法可以在不使用 运行 代码的情况下通过 -dD 之类的选项来获取宏值,但我还没有让它起作用。)

假设你的头文件没有声明任何其他常量(这对于 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.