什么是在Windows中将Boost与CMake和Visual Studio链接的正确方法?

时间:2015-06-24 10:16:43

标签: visual-studio-2012 boost cmake

我正在尝试为Visual Studio 2012生成一些我需要的Boost 1.58库(chrono,regex和thread),并将这些库与CMake链接起来。根据我设置的配置,我在CMake和Visual Studio中找到或链接库时遇到了实际问题。

我终于使用以下配置:

bjam.exe --link = static --threading multi --variant = debug stage

但这似乎不会产生静态库。

如何生成lib并使用CMake搜索它们以便Visual Studio正确链接它们?

2 个答案:

答案 0 :(得分:8)

我终于提出了解决方案,我认为它足够详细,可以成为一个通用的答案。

Visual Studio搜索动态库,因此我们需要将Boost库编译为共享,多线程,调试和发布以及运行时链接共享。在使用bjam.exe的windows中,除链接外,所有命令都有前缀“ - ”,因此构建库的正确方法是:

bjam.exe link=shared --threading=multi --variant=debug --variant=release --with-chrono --with-regex --with-thread stage

这将在Boost / stage / lib文件夹中生成libs和DLL,因此我们需要设置一个环境变量Boost_LIBRARY_DIR C:/ Boost / stage / lib。

可能会有更多选择:

runtime-link = shared/static
toolset= msvc-11.0

库的名称将如下所示:

boost_chrono-vc110-mt-1_58.lib
boost_chrono-vc110-mt-1_58.dll

对于调试:

boost_chrono-vc110-mt-gd-1_58.lib
boost_chrono-vc110-mt-gd-1_58.dll

为了让CMake正确链接它们,我们需要在CMakeLists.txt中编写以下内容:

    add_definitions( -DBOOST_ALL_DYN_LINK )  //If not VS will give linking errors of redefinitions
    set(Boost_USE_STATIC_LIBS OFF )
    set(Boost_USE_MULTITHREADED ON)
    set(Boost_USE_STATIC_RUNTIME OFF)
    find_package(Boost COMPONENTS thread chrono regex REQUIRED )

    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})

    TARGET_LINK_LIBRARIES( ${PROJ_NAME} ${Boost_LIBRARIES} )  

答案 1 :(得分:3)

  

bjam.exe --link = static --threading multi --variant = debug stage

     

但这似乎不会产生静态库。

构建特殊阶段目标将Boost库二进制文件放在Boost树的stage \ lib \子目录中。 有关在Windows上构建Boost的更多信息here

CMake的:

SET (CMAKE_BUILD_TYPE Debug) # in order to link with boost debug libs you may need to set that to build your program in debug mode (or do that from command line)

FIND_PACKAGE (Boost 1.58 COMPONENTS "chrono" "regex" "thread" REQUIRED)

#ADD_DEFINITIONS(-DBOOST_ALL_DYN_LINK) # make sure you don't have this as it will try to link with boost .dll's

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

TARGET_LINK_LIBRARIES(${EXE_OR_LIB_NAME} ${Boost_LIBRARIES})