我正在开发一个共享库,它有一些包含以下函数模板的头文件:
#ifdef somecompilerflag
#define FUNCTION functionA
#else
#define FUNCTION functionB
#endif
void FUNCTION( ... );
somecompilerflag
是编译 my 库时定义的内容。但是,如果其他人想要链接到这个库,我不希望他们在包含这些头文件时必须拿起我的编译器标志。有没有办法在编译库时解析这些#ifdefs
,以便生成的头文件看起来像:
void functionA( ... );
答案 0 :(得分:1)
如果您的目标是Linux& co,那就是一个名为“pkg-config”的东西,它是一个检索特定已安装库的编译器和链接器设置的框架。另一种选择是编写一个sed脚本,将模板头文件转换为正确的安装版本。我甚至在编译库之前就这样做了,因为那时你可以确保在编译时使用相同的标题并且它适合。
答案 1 :(得分:0)
您可以向Makefile添加定义。您可以在此处查看如何执行此操作:Passing C/C++ #defines to makefile
答案 2 :(得分:0)
前面有一个答案提到这种方法,即如果somecompilerflag
被定义,当“编译”头文件(实际上复制到另一个目录)时,在顶部插入#define somecompilerflag
的文件。对于makefile,类似于:
ifeq ($(somecompilerflag),-Dsomecompilerflag)
sed '1 i\#define somecompilerflag' $(header) > headersDir/$(header)
else
cp $(header) headersDir/$(header)
endif
答案 3 :(得分:0)
如何将您的第一个预处理器指令更改为#ifndef而不是#ifdef?
这样,如果没有设置标志,FUNCTION将解析为functionA,听起来就像你想要的那样。
如果你想进一步做到这一点,以便其他人甚至看不到你的预处理器指令,你可以简单地通过预处理器运行你的代码并交给人们产生的结果。