我正在尝试构建一个共享对象库,该库将被使用dlopen()函数打开的程序所调用。这个库将使用由另一个静态库提供的功能。
我在链接动态库时加入了相应的标志以拉取静态库(例如,我使用-lfoo来链接libfoo.a),链接器没有报错。然而,当主程序调用dlopen()函数打开动态库时,会出现“未定义符号”的错误消息,引用静态库中的符号。
运行nm命令确实显示了问题符号在动态库中是未定义的,主程序也不包含该符号,那么如何强制链接器引入这个符号呢?这个符号本身位于未初始化数据部分(在nm输出中为符号类型“B”)。
--whole-archive
选项会将存档文件中的所有符号转换为共享库中的导出符号。如果您只需要一个符号,则此选项可以减少 .so 文件的膨胀。 - MuertoExcobito