You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译可移植Matlab封装C/C++库包的链接问题咨询

Matlab高层语言包预编译的静态库链接问题

我正在开发用于Matlab的高层语言包,用来封装第三方C/C++库的函数。

目标

预编译该包,使其能在任意计算机上运行,无需安装外部库的非标准依赖。

环境配置

外部库是通过cmake构建的git submodule。我有一个内部库,负责实现外部库数据类型与Matlab数据类型的转换。另外还有独立的C函数(称为mex functions),依赖内部库和外部库,编译后可直接在Matlab中调用。理想状态是把内部库编译成shared library,避免所有mex文件重复包含通用函数。

尝试方案

    1. 将外部库构建为shared library,让内部库和mex函数都链接该库,但这样会产生对非标准库的运行时依赖,不符合目标要求。
    1. 将外部库构建为static library,让内部库链接它,再让mex函数仅链接内部库。默认情况下内部库只会包含其依赖的外部库符号,会导致mex函数需要的其他符号缺失。GCC的链接选项--whole-archive可以强制链接器把静态外部库的所有对象添加到内部库,我的设置如下:
target_link_libraries(internallib
  PRIVATE -Wl,--whole-archive externallib -Wl,--no-whole-archive
)

我理解的是,把外部库放在--whole-archive和--no-whole-archive之间,能确保链接器仅链接该库的所有对象而非全部库。编译正常,但测试时出现外部库中定义的符号未找到的运行时错误,原因不明。

    1. 不链接外部库,而是把外部库的目标文件作为内部库的源文件:
add_library(internallib
  SHARED
  ${src_files}
  $<TARGET_OBJECTS:externallib>
)

还是出现相同的符号未找到错误,而且我觉得这种方式无法消除对外部库依赖项的运行时依赖。

    1. 让内部库和mex函数都链接静态外部库。这个方案在Linux和macOS上可行,但在Windows(使用mingw的gcc/g++)上出现多重定义错误。我认为原因是内部shared library获取了mex函数也需要的外部库符号,导致这些符号在内部库和外部库中都有定义,链接器无法确定mex函数该使用哪一个。

疑问

我认为方案2最具可行性,但没法成功添加外部库的所有符号。我是不是误用或误解了--whole-archive选项?

内容的提问来源于stack exchange,提问作者sn8wman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:12:26