如何将#defines从C ++共享库导出到应用程序

时间:2019-02-28 05:14:12

标签: c++ linux makefile shared-libraries dllexport

我的库是在启用了#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'}); ,反之亦然

如果不可能以预定的方式进行操作,那么欢迎任何解决此问题的技巧。

2 个答案:

答案 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