编译可移植Matlab封装C/C++库包的链接问题咨询
Matlab高层语言包预编译的静态库链接问题
我正在开发用于Matlab的高层语言包,用来封装第三方C/C++库的函数。
目标
预编译该包,使其能在任意计算机上运行,无需安装外部库的非标准依赖。
环境配置
外部库是通过cmake构建的git submodule。我有一个内部库,负责实现外部库数据类型与Matlab数据类型的转换。另外还有独立的C函数(称为mex functions),依赖内部库和外部库,编译后可直接在Matlab中调用。理想状态是把内部库编译成shared library,避免所有mex文件重复包含通用函数。
尝试方案
- 将外部库构建为shared library,让内部库和mex函数都链接该库,但这样会产生对非标准库的运行时依赖,不符合目标要求。
- 将外部库构建为static library,让内部库链接它,再让mex函数仅链接内部库。默认情况下内部库只会包含其依赖的外部库符号,会导致mex函数需要的其他符号缺失。GCC的链接选项
--whole-archive可以强制链接器把静态外部库的所有对象添加到内部库,我的设置如下:
- 将外部库构建为static library,让内部库链接它,再让mex函数仅链接内部库。默认情况下内部库只会包含其依赖的外部库符号,会导致mex函数需要的其他符号缺失。GCC的链接选项
target_link_libraries(internallib PRIVATE -Wl,--whole-archive externallib -Wl,--no-whole-archive )
我理解的是,把外部库放在--whole-archive和--no-whole-archive之间,能确保链接器仅链接该库的所有对象而非全部库。编译正常,但测试时出现外部库中定义的符号未找到的运行时错误,原因不明。
- 不链接外部库,而是把外部库的目标文件作为内部库的源文件:
add_library(internallib SHARED ${src_files} $<TARGET_OBJECTS:externallib> )
还是出现相同的符号未找到错误,而且我觉得这种方式无法消除对外部库依赖项的运行时依赖。
- 让内部库和mex函数都链接静态外部库。这个方案在Linux和macOS上可行,但在Windows(使用mingw的gcc/g++)上出现多重定义错误。我认为原因是内部shared library获取了mex函数也需要的外部库符号,导致这些符号在内部库和外部库中都有定义,链接器无法确定mex函数该使用哪一个。
疑问
我认为方案2最具可行性,但没法成功添加外部库的所有符号。我是不是误用或误解了--whole-archive选项?
内容的提问来源于stack exchange,提问作者sn8wman
相关产品推荐
相关产品推荐

