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

时间:2017-07-14 17:46:52

标签: dll cmake linker

我在我的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   

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

1 个答案:

答案 0 :(得分:0)

所以,我不确定为什么会这样。但是在链接到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")

然后能够找到符号。如果有人对此工作原因有任何意见/更正请添加。