首页 > 解决方案 > 如何将 #defines 从 C++ 共享库导出到应用程序

问题描述

我的库是用一些#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

现在,应用程序通过包含使用 libfoo 库public/foo.h并使用他自己的构建配置来构建应用程序。但问题是应用程序不知道USE_FOO在应用程序端始终未定义哪个。因此SIZE应用程序中将有 10 个,但库中将有 5 个

我想USE_FOO根据它是否定义来导出到应用程序libfoo.so。即如果libfoo.so是用USE_FOO=1应用程序构建的,也应该看到USE_FOO=1,反之亦然

如果无法以预定义的方式进行操作,那么任何解决此问题的技巧都会受到欢迎。

标签: c++linuxmakefileshared-librariesdllexport

解决方案


在 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,客户端应通过从 MakefileCFLAGS调用来正确查询:pkg-config

CFLAGS = -g -Wall -Wextra $(pkg-config --cflags)

有关更多详细信息,请查看指南

唯一可移植的解决方案是添加一个自动生成的 foo-config.h标头,该标头将包含在所有库公共标头中,并将定义所有特定于版本的定义(如USE_FOO)。这当然只适用于实际包含库头文件的源文件。


推荐阅读