构建共享库时出现链接错误,即使包含源文件也是如此



我正在从我的 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} )

我稍后还将一堆其他 .libs 与 mylibrary 链接起来(是否存在冲突问题?当我尝试构建mylibrary时,问题出现了。我收到链接错误,例如:

Severity    Code    Description                         Project File    Line    Suppression State
Error   LNK2001 unresolved external symbol __imp_cosf   mylibrary    ***.obj    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")

然后能够找到符号。如果有人对为什么这样做有任何意见/更正,请补充。

最新更新