2016-07-19 6 views
1

Я проверил несколько вопросов, но ни один из ответов не помог мне. Вот те, которые я проверилДинамическое связывание с Cmake

How to link C++ program with Boost using CMake

Whats the proper way to link Boost with CMake and Visual Studio in Windows?

Error linking Boost with CMake

Я построил подталкивание 1,61 с

b2 variant=debug,release link=static,shared threading=single,multi 

Под стадии/Lib, у меня есть все DLLки и библиотеки , После Повышения :: Система ЛИЭС находится в стадии/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 

Я хочу, чтобы составить базовый пример подталкивания ASIO (что требует системного LIB от повышения). Я создаю файл cmake с cmake-gui в окнах, а затем создаю файлы проекта 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 находит библиотеку наддува, вот выход из CMake-гуй

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 

В настоящее время существуют две проблемы здесь. Во-первых, он не может найти библиотеку, а во-вторых, хотя он явно направляет компоновщик для динамической связи, он по-прежнему ищет статическую библиотеку. Я не знаю, связаны ли эти проблемы. Как решить эту проблему? Как динамически связывать Boost с помощью Cmake?

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; 
} 
+2

'Boost_USE_ *' переменные должны быть установлены ** перед тем ** 'find_package (Boost)' призыв иметь эффект , – Tsyvarev

+0

Исправлено построение после добавления 'find_package (Boost)' right before 'if (Boost_FOUND)', похоже, оно не имеет эффекта –

+0

Вам нужно очистить кэш CMake для регенерации результата 'find_package()'. – Tsyvarev

ответ

1

Добавление следующие флаги в вашем CMakeLists.txt решает проблему:

add_definitions(-DBOOST_ALL_NO_LIB) 
add_definitions(-DBOOST_ALL_DYN_LINK) 
Смежные вопросы