我正在尝试为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正确链接它们?
答案 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})