繁体   English   中英

gcc C预处理器可以使用shell命令的输出吗?

[英]Can the gcc C preprocessor use the output of a shell command?

例如,'uname -a'的输出可以用于创建下面的COMPILED_ON宏吗?

#include <stdio.h>

#define COMPILED_ON `call uname -a and use the output as a quoted string'

int main( int argc, char **argv ) {
    printf( COMPILED_ON );
    return 0;
}

不是,但:

gcc -DCOMPILED_ON="$(uname -a)"

我不认为你可以用GNU预处理器做到这一点,但肯定不能用普通的标准预处理器来做; 相反,我认为这是Makefile的工作。

让它运行uname -a并将其存储在Makefile变量中,该变量将用于为编译器创建正确的-D指令。

您还可以使Makefile创建一个包含宏定义的.h文件,该文件将由需要COMPILED_ON宏的文件#include d。 这有额外的好处,即独立于编译器特定的选项来定义宏。

请注意,这些建议也适用于构建除了良好的制作之外的工具。

不是那样的,没有。

你需要这样做:

gcc "-DCOMPILED_ON=\"`uname -a`\"" -c file.c -o file.o

或者,让你的makefile创建一个简单的.h文件:

echo "#define COMPILED_ON \"`uname -a`\"" > compiledon.h

然后#include "compiledon.h"

你需要\\"部分才能得到一个可用的字符串。

如果您碰巧使用CMake我有一个很好的片段,可能会帮助一些:

# This ensures the SHA1 git ref is shown within the app
execute_process(COMMAND git rev-parse HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE GITSHA1REF)
string(REGEX REPLACE "\n$" "" GITSHA1REF "${GITSHA1REF}")
message(STATUS "GITSHA1REF = ${GITSHA1REF}")
add_definitions("-DGITSHA1REF=\"${GITSHA1REF}\"")

有了这个,我得到了当前的Git SHA1哈希并在我的C ++代码中使用它:

std::cout << "Git-SHA1: " << GITSHA1REF << std::endl;

不,但你可以以不那么脆弱和SCCS敌对的方式实现你的目标。

  1. 让make target运行shell脚本来创建.h文件。

  2. 通过shell命令设置一个make变量并传递-D 并非所有make(1)实现都支持此功能。

  3. 让make目标使用包含shell命令的-D运行编译器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM