c++ - cmake 从对象库构建共享库会导致未定义的符号
问题描述
我正在使用 cmake 构建一个共享库。以下是我采取的步骤,从A_shared
使用对象库构建共享库开始A_obj
。
add_library(A_obj OBJECT ${A_SRCS})
add_library(A_shared SHARED)
target_link_libraries(A_shared PUBLIC A_obj)
这个过程有效。现在我希望构建另一个共享库,它使用A_shared
它自己的源。所以我有:
add_library(B_obj OBJECT ${B_SRCS})
target_link_libraries(B_obj PUBLIC A_shared)
add_library(B_shared SHARED)
target_link_libraries(B_shared PUBLIC B_obj)
在我看来,这应该是有效的,因为我正在构建B_obj
依赖于共享库的A_shared
对象,然后使用这些对象来构建共享库B_shared
,同时传递对A_shared
使用调用的依赖target_link_libraries
。
但是,这会导致在 MSVC 中构建时出现未定义的符号。链接时,我对在中定义和使用的B_shared.dll
全局变量有未解决的外部依赖关系,而不是其他任何东西(如函数)。奇怪的是,目标文件编译得很好。${A_SRCS}
${B_srcs}
B_obj
- 如果我改为链接
B_shared
到A_obj
,它工作正常。但这给我的印象是B_shared
实际上将包含来自 的目标文件A_obj
,但我只希望它链接到A_shared
. - 如果我链接
B_obj
到A_obj
,没有任何变化,我仍然得到未解决的依赖关系。
用gcc,B_shared
是成功链接的。
因此,我的问题是:我在 cmake 中做正确的事情来实现我想要的吗?我想知道我在误解什么,因为我已经对此进行了广泛的研究,但我找不到我的过程中的错误,所以我非常感谢任何澄清。
解决方案
这通常来自 Windows 上共享库的行为:请参阅此问题。我必须手动导出符号。与对象库的交互不会产生问题。
推荐阅读
- firebase - 如何在 Firestore 中的多个位置更新头像/photoUrl?
- php - 如何使用 IOT 访问公共 Facebook 页面上的信息?
- java - Java 性能问题:需要使用目标分支检查迭代超过 800 万条记录
- javascript - 为什么这个 Javascript 代码是异步的?
- excel - 如何使用滚动条在 Excel 中制作“实时图表”
- java - 如何获取项目之间的所有路径
- angular - 在带有模板的 Angular ng-bootstrap 模态中,关闭和关闭按钮不起作用
- mongodb - Mongodb $external 数据库无法创建具有用户定义角色的新用户
- testing - Perl6 通用代码来测试模块是否加载
- shell - Ansible vmware_vm_shell SED 命令添加额外字符