CMake FindBoost for-mt-s库后缀

CMake FindBoost for-mt-s库后缀,boost,64-bit,cmake,flags,nmake,Boost,64 Bit,Cmake,Flags,Nmake,首先:Windows 7 x64使用Microsoft CL.exe命令行编译器和CMake,在amd64 Visual Studio命令行上正确配置。我已经解决了一些基本问题(例如,我试图链接到共享而不是静态Boost,我试图链接到x86 Boost和x64目标,等等),现在我已经弄清楚了这些问题,我正试图用CMake标记来标记Boost 我已经了解了Boost的不同名称(比如-mt-gd的意思)。我的Boost库都是-mt-s(Release multi-threaded) 我想知道Find

首先:Windows 7 x64使用Microsoft CL.exe命令行编译器和CMake,在amd64 Visual Studio命令行上正确配置。我已经解决了一些基本问题(例如,我试图链接到共享而不是静态Boost,我试图链接到x86 Boost和x64目标,等等),现在我已经弄清楚了这些问题,我正试图用CMake标记来标记Boost

我已经了解了Boost的不同名称(比如-mt-gd的意思)。我的Boost库都是-mt-s(Release multi-threaded)

我想知道FindBoost的哪个CMake变量对应于-g和-d后缀

以下是我的简历:

cmake_minimum_required( VERSION 2.8 )

project( echoserv )

set( APP_NAME Echoserv )
set( MAIN_SOURCE echoserv.cpp )
set( CMAKE_BUILD_TYPE "RELEASE" )

set( Boost_USE_STATIC_RUNTIME ON )
set( Boost_USE_STATIC_LIBS ON )
set( Boost_DEBUG ON )

find_package( Boost COMPONENTS system REQUIRED )

add_executable( ${APP_NAME} ${MAIN_SOURCE} )

include_directories( ${Boost_INCLUDE_DIR} )
link_directories( ${Boost_LIBRARY_DIRS} )
target_link_libraries( ${APP_NAME} ${Boost_LIBRARIES} )
尝试编译时产生的错误是:

LINK : fatal error LNK1104: cannot open file 'libboost_system-vc100-mt-gd-1_53.lib'
这是因为我的Boost库的格式都是“-vc100-mt-s-1_53.lib”。那个么,我应该使用什么标志来让它链接到-mt-s libs并停止尝试链接到-mt-gd

资源:

显然,cmake.org链接应该是有用的,但我认为我设置的变量是正确的,它仍然试图链接mt gd

编辑:以下是设置Boost_DEBUG打开时的输出:

(请注意,Boost库已安装到%LIB%。)


在Windows上,如果您已经构建了两个版本,那么没有办法告诉CMake只查找Boost的发布版本。在Windows上,如果您计划在Debug和Release中构建项目,通常也会构建Boost的Debug和Release版本,因为它们都链接到不同版本的C运行时库;i、 e.通常,在同一个文件夹中不仅有libboost_system-vc100-mt-s-1_53.lib,还有libboost_system-vc100-mt-sgd-1_53.lib

因此,对于您的CMakeLists.txt(假设正确找到boost root dir),
${boost_LIBRARIES}
的值应该如下所示:

优化/stage/lib/libboost_system-vc100-mt-s-1_53.lib;调试/stage/lib/libboost_system-vc100-mt-sgd-1_53.lib
然后,当您执行
(${APP_NAME}${Boost_LIBRARIES})
时,您要说的是链接到哪个版本的Boost lib,这取决于它是调试版本还是发布版本

VS正在寻找libboost_system-vc100-mt-gd-1_53.lib的事实让我认为这可能是由于boost的自动链接功能。当然,有了
设置(Boost\u USE\u STATIC\u RUNTIME ON)
行,CMake甚至不应该寻找libboost\u system-vc100-mt-gd-1\u 53.lib

通过添加以下行,可以关闭Boost的自动链接功能:

add_definitions(-DBOOST_ALL_NO_LIB)

进一步阅读:如果我的答案没有帮助,您可以在更改为
设置(Boost\u DEBUG ON)
后添加CMake命令的输出吗?添加了调试输出。请注意,Boost库已安装到%LIB%amd64目录。在重新运行CMake?Hi Fraser之前,您已经删除了CMakeCache.txt,谢谢您的回复。我只构建了发布版本。如何告诉它仅针对发行版进行链接?如果您只提供了Boost libs的发行版,那么
${Boost_LIBRARIES}
将只包含那些(没有任何
优化的
调试
参数)无论您是在调试还是发布中构建,都应该使用。您是否确实使用
/MT
标志集(即使用静态CRT)而不是
/MD
编译程序?如果您有这样的不匹配(boost使用
/MT
编译,而您的boost使用
/MD
编译),并且您没有
添加定义(-DBOOST\u ALL\u NO\u LIB)
,那么您将得到一条与您看到的错误消息类似的错误消息。但我也希望它能包含更多关于原因的信息。
add_definitions(-DBOOST_ALL_NO_LIB)