动态链接boost与Cmake
我检查了几个问题,但没有一个答案对我的情况有帮助。这是我查过的 我已经用它构建了Boost 1.61动态链接boost与Cmake,boost,linker,cmake,dynamic-linking,Boost,Linker,Cmake,Dynamic Linking,我检查了几个问题,但没有一个答案对我的情况有帮助。这是我查过的 我已经用它构建了Boost 1.61 b2 variant=debug,release link=static,shared threading=single,multi 在stage/lib下,我有所有DLL和lib。以下Boost::stage/lib下存在系统lib boost_system-vc140-mt-1_61.dll boost_system-vc140-mt-1_61.lib boost_system-vc
b2 variant=debug,release link=static,shared threading=single,multi
在stage/lib下,我有所有DLL和lib。以下Boost::stage/lib下存在系统lib
boost_system-vc140-mt-1_61.dll
boost_system-vc140-mt-1_61.lib
boost_system-vc140-mt-gd-1_61.dll
boost_system-vc140-mt-gd-1_61.lib
libboost_system-vc140-mt-1_61.lib
libboost_system-vc140-mt-gd-1_61.lib
我想编译一个基本的boost asio示例(它需要来自boost的系统库)。我在windows中使用cmake gui创建我的cmake文件,然后生成VS2015项目文件。尝试生成项目后,出现以下错误
1>------ Build started: Project: ZERO_CHECK, Configuration: Debug Win32 ------
2>------ Build started: Project: boost-asio, Configuration: Debug Win32 ------
2> main.cpp
2> Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. For example:
2> - add -D_WIN32_WINNT=0x0501 to the compiler command line; or
2> - add _WIN32_WINNT=0x0501 to your project's Preprocessor Definitions.
2> Assuming _WIN32_WINNT=0x0501 (i.e. Windows XP target).
2>LINK : fatal error LNK1104: cannot open file 'libboost_system-vc140-mt-gd-1_61.lib'
========== Build: 1 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我的CMakeLists.txt的内容
cmake_minimum_required(VERSION 3.6)
project(boost-asio)
find_package(Boost 1.61.0 COMPONENTS system REQUIRED)
# set cmake variables
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/bin)
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
# definitions
add_definitions(-DBOOST_LOG_DYN_LINK=1)
# set sources
set(SOURCES src/main.cpp)
# manage compilation and linkage
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(boost-asio ${SOURCES})
target_link_libraries(boost-asio ${Boost_LIBRARIES})
message(${Boost_INCLUDE_DIRS})
message(${Boost_LIBRARIES})
endif()
请注意,cmake源中的定义是根据我检查的某个问题的答案添加的。FindBoost查找boost库,下面是cmake gui的输出
Boost version: 1.61.0
Found the following Boost libraries:
system
C:/Boost/boost_1_61_0
optimizedC:/Boost/boost_1_61_0/stage/lib/boost_system-vc140-mt-1_61.libdebugC:/Boost/boost_1_61_0/stage/lib/boost_system-vc140-mt-gd-1_61.lib
现在这里有两个问题。第一,它找不到库;第二,尽管它清楚地指示链接器动态链接,但它仍然查找静态库。我不知道这些问题是否相关。如何解决这个问题?如何使用Cmake动态链接Boost
EDIT1:这是我正在使用的代码,如果您想测试它的话
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main() {
boost::asio::io_service ioservice;
boost::asio::deadline_timer t(ioservice, boost::posix_time::seconds(5));
t.wait();
std::cout << "Hello, world!" << std::endl;
return 0;
}
#包括
#包括
#包括
int main(){
boost::asio::io_服务ioservice;
boost::asio::deadline_timer t(ioservice,boost::posix_time::seconds(5));
t、 等待();
std::cout在CMakeLists.txt中添加以下标志可以解决此问题:
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
Boost\u USE.*
变量应该在find\u package(Boost)
调用之前设置。在添加find\u package(Boost)
之后尝试构建,如果(Boost\u FOUND)
之前,它似乎没有效果您需要清除CMake缓存以重新生成find\u package()的结果
。我删除了缓存,重新配置并重新生成了项目文件。仍然是一样的。您不应该在find\u package()
中添加asio
作为一个组件,因为这不仅仅是系统
?最好的方法:使用添加目标编译定义(私有BOOST\u DYN\u链接)