2017-07-14 54 views
0

我指定从源文件共享的库构建在我的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(难道还有一个撞击的问题?)。当我尝试构建磁带库时出现问题。我收到链接错误,如:

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

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

+0

最好的事情是,如果你能提供一个重现此错误的最小例子。如果你能从“输出窗口”向我们显示消息并且不仅形成“错误窗口”,它也会有所帮助 - 我想你正在使用VS – Vertexwahn

回答

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") 

然后将这些符号都能够被发现。如果任何人有任何意见/更正为什么这个工作,请添加。

+0

看来我的提示 - 看看“输出窗口” - 有帮助你;) – Vertexwahn

+0

/MTd是用于静态链接的UCRT的调试版本。/MT非调试版本 - 更多详细信息,请访问:https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx – Vertexwahn