【问题标题】:Link errors when building shared library even though source files are included即使包含源文件,在构建共享库时也会出现链接错误
【发布时间】:2017-07-14 17:46:52
【问题描述】:

我正在从我的 CMakeLists.txt 文件中的源文件指定一个共享库构建,如下所示:

# Library setup
file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Source/*.cpp)
file(GLOB_RECURSE HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/Source/*.h)

在源目录中包含构建共享库所需的所有 .h 和 .cpp 文件。所以我然后做这样的事情:

add_library(mylibrary SHARED ${SOURCES} ${HEADERS} )

我稍后也会将一堆其他 .lib 与 mylibrary 链接(会不会有冲突的问题?)。当我尝试构建 mylibrary 时出现问题。我收到链接错误,例如:

Severity    Code    Description                         Project File    Line    Suppression State
Error   LNK2001 unresolved external symbol __imp_cosf   mylibrary    ***.obj    1   

即使符号是在我包含的源文件中定义的。我不确定该怎么做才能正确地让我的项目找到这些符号。有趣的是,当我构建为静态库时它很好。但是,当我尝试构建为动态库时,会出现这些错误。

【问题讨论】:

  • 如果你能提供一个最小的例子来重现这个错误,最好的办法就是。如果您可以向我们展示来自“输出窗口”的消息,而不仅仅是形成“错误窗口”,这也会有所帮助 - 我猜您正在使用 VS

标签: dll cmake linker


【解决方案1】:

所以,我不确定为什么会这样。但是链接到 MSVRCT 和 libcmt 之间存在冲突警告。它在输出日志中说了这样的话:

Resolving LNK4098: defaultlib 'MSVCRT' conflicts with ...

这是因为 libcmt 是用于发布构建的静态库并使用 \MT 标志。 MSVRCT 是一个发布 DLL 版本,并使用 \MD 标志编译。由于这个冲突,我不得不将我的编译器标志更改为:

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

然后可以找到符号。如果有人对为什么这样做有任何 cmets/更正,请添加。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多