我的库是在启用了#define
的情况下构建的(例如-DUSE_FOO=1
),并且USE_FOO
也用于公共头文件中。
问题在于使用库的应用程序包含公共头文件,因此USE_FOO
出现在应用程序上下文中,并且在应用程序上下文中未定义。
如何根据库中是否启用USE_FOO
定义将其导出到应用程序?
例如
include/public/foo.h
lib/libfoo.so --> foo.cc
in foo.h contain code as
#if defined (USE_FOO)
#define SIZE 5
#else
#define SIZE 10
#endif
foo.cc
#include "foo.h"
int getSizeFromLib()
{
return SIZE;
}
libfoo.so
源文件包括foo.h
,并通过在编译时配置USE_FOO
来构建。
现在,应用程序通过包含public/foo.h
来使用libfoo库,并使用自己的构建配置来构建应用程序。但是问题是应用程序没有意识到USE_FOO
,而该SIZE
在应用程序端始终是未定义的。因此USE_FOO
在应用程序中将为10,而在库中为5
我希望基于libfoo.so
是否为libfoo.so
定义的应用程序将其导出到应用程序。也就是说,如果USE_FOO=1
是使用USE_FOO=1
构建的,则应用程序也应该看到Router.route('/image', function () {
const text = this.params.query.text;
const image = callMagicFunctionToGenerateImageFrom(text);
this.response.setHeader('Content-Type', 'image/png'););
this.response.write(image);
}, {where: 'server'});
,反之亦然
如果不可能以预定的方式进行操作,那么欢迎任何解决此问题的技巧。
答案 0 :(得分:2)
在Linux世界中,此任务由pkgconfig工具解决。基本上,除了二进制文件和头文件外,您的库还带有一个.pc
文件,看起来像
prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: foo
Description: The foo library
Version: 1.0.0
Cflags: -I${includedir}/foo USE_FOO=1
Libs: -L${libdir} -lfoo
此文件已安装到/usr/lib/pkgconfig
,客户端应通过从Makefile调用CFLAGS
来从文件中查询正确的pkg-config
:
CFLAGS = -g -Wall -Wextra $(pkg-config --cflags)
有关更多详细信息,请检查guide。
唯一的便携式解决方案是添加自动生成的 foo-config.h
标头,该标头将包含在所有库公共标头中,并定义所有版本-具体定义(如USE_FOO
)。当然,这仅适用于实际上包含库头的源文件。
答案 1 :(得分:0)
无法将预处理器定义从库“导出”到应用程序。两者都必须使用兼容的标志进行编译,例如:
CFLAGS=-DUSE_FOO=1
gcc $CFLAGS --shared -o lib/libfoo.so foo.cc
gcc $CFLAGS lib/libfoo.so app.c