0

我正在开发一个共享库,其中包含一些包含函数模板的头文件,例如:

#ifdef somecompilerflag
#define FUNCTION functionA
#else
#define FUNCTION functionB
#endif

void FUNCTION( ... );

somecompilerflag是在编译我的库时定义的。但是,如果其他人想要链接到这个库,我不希望他们在包含这些头文件时必须拿起我的编译器标志。有没有办法#ifdefs在编译库时解决这些问题,以便生成的头文件看起来像:

void functionA( ... );
4

4 回答 4

1

如果你的目标是 Linux&co,有一个叫做“pkg-config”的东西,它是一个用于检索特定已安装库的编译器和链接器设置的框架。另一种选择是编写一个 sed 脚本将模板头文件转换为正确的版本以进行安装。我什至会在编译库之前这样做,因为这样您就可以确保在编译时使用相同的头文件并且它适合。

于 2013-01-15T20:22:09.150 回答
0

您可以将定义添加到您的 Makefile。你可以在这里查看如何做到这一点:Passing C/C++ #defines to makefile

于 2013-01-15T20:17:23.623 回答
0

前面有一个答案暗示了这种方法,如果somecompilerflag定义了,则在“编译”头文件(实际上是复制到另一个目录)时插入#define somecompilerflag文件顶部。对于makefile,大致如下:

ifeq ($(somecompilerflag),-Dsomecompilerflag)
    sed '1 i\#define somecompilerflag' $(header) > headersDir/$(header)
else
    cp $(header) headersDir/$(header)
endif
于 2013-01-15T21:38:44.750 回答
0

将您的第一个预处理器指令更改为#ifndef 而不是#ifdef 怎么样?

这样,如果未设置标志,FUNCTION 将解析为 functionA,这听起来像你想要的。

如果您想更进一步并使其他人甚至看不到您的预处理器指令,您可以简单地通过预处理器运行您的代码并将结果输出交给人们。

于 2013-01-16T04:52:46.367 回答