【问题标题】:cmake building shared lib from object library results in undefined symbolcmake 从对象库构建共享库会导致未定义的符号
【发布时间】:2021-07-08 10:56:22
【问题描述】:

我正在使用 cmake 构建一个共享库。以下是我采取的步骤,首先使用对象库A_obj 构建共享库A_shared

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,同时使用对target_link_libraries 的调用传递对A_shared 的依赖。

但是,这会导致在 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 中做正确的事情来实现我想要的?我想知道我误解了什么,因为我已经对此进行了广泛的研究,但我找不到我的过程中的错误,所以我非常感谢任何澄清。

【问题讨论】:

  • 问题实际上来自这里提出的问题:stackoverflow.com/questions/54560832/… 尽管我正在写set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE),但这不适用于全局变量。我必须手动导出它们。

标签: c++ visual-c++ cmake g++ shared-libraries


【解决方案1】:

这通常来自 Windows 上共享库的行为:请参阅 this question。我必须手动导出符号。与对象库的交互没有产生问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2019-10-31
    • 2016-07-29
    • 2011-02-28
    • 1970-01-01
    • 2020-11-25
    • 2015-10-11
    相关资源
    最近更新 更多