获取定义变量的值
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
.
我正在尝试编写一个 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
.