编译共享库时解析ifdef

时间:2013-01-15 20:14:00

标签: c++ c templates makefile shared-libraries

我正在开发一个共享库,它有一些包含以下函数模板的头文件:

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

void FUNCTION( ... );

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

void functionA( ... );

4 个答案:

答案 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,听起来就像你想要的那样。

如果你想进一步做到这一点,以便其他人甚至看不到你的预处理器指令,你可以简单地通过预处理器运行你的代码并交给人们产生的结果。