c++ - 如何将 #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
,反之亦然
如果无法以预定义的方式进行操作,那么任何解决此问题的技巧都会受到欢迎。
解决方案
在 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
)。这当然只适用于实际包含库头文件的源文件。
推荐阅读
- oracle - 将 LISTAGG 转换为 XMLAGG
- c# - Xamarin - NavigationPage.TitleView 内的 StackLayout 不会使用所有空间?
- regex - 正则表达式只选择点但前后不应该有任何数字
- azure-iot-central - 无法使用 X509 证书连接到 IoT Central
- mongodb - MongoDB 通过减少一个百分比来更新值
- vba - 在 Access 报表上使用 Select 查询
- javascript - Typescript 编译的 Javascript 代码不起作用(variable.default.function())
- javascript - 无法使用 JS 访问 svg 中的元素
- python - 查找列表中的下一个元素
- java - 递归定义中的堆栈溢出错误