2016-07-19 20 views
1

Ich habe mehrere Fragen überprüft, aber keine der Antworten half meinem Fall. Hier sind die, die ich überprüftDynamisch Boost mit Cmake verknüpfen

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

I-Boost 1.61 mit

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

Unter Bühne/lib erstellt haben, habe ich alle dlls und Libs . Im Anschluss an boost :: sind System-Bibliotheken vorhanden unter der Bühne/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 

ich ein Grundlade Asio Beispiel kompilieren will (das System lib von Boost erfordern). Ich mache meine cmake-Datei mit cmake-gui in Windows und erzeuge dann VS2015-Projektdateien. Nach dem Versuch, das Projekt zu erstellen, tritt ein Fehler auf.

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 ========== 

Die Inhalte meiner 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() 

Bitte beachten Sie, dass die Definition in der Cmake Quelle nach einer Antwort auf irgendeine Frage hinzugefügt wird, ich überprüft. FindBoost findet die Boost-Bibliothek, hier ist eine Ausgabe von 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 

Nun gibt es zwei Probleme hier. Erstens kann es die Bibliothek nicht finden, und zweitens, obwohl es den Linker eindeutig dazu anleitet, dynamisch zu verknüpfen, sucht es immer noch nach einer statischen Bibliothek. Ich weiß nicht, ob diese Probleme zusammenhängen. Wie man dieses Problem löst? Wie man Boost dynamisch mit Cmake verbindet?

EDIT1: Hier ist der Code, den ich verwende, wenn Sie es testen möchten.

#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_ *' Variablen sollten ** vor ** 'find_package (Boost)' Aufruf gesetzt werden für eine Wirkung haben . – Tsyvarev

+0

Versuchte Gebäude, nachdem 'find_package (Boost)' direkt vor 'if (Boost_FOUND) 'hinzugefügt wurde, scheint es keinen Effekt zu haben –

+0

Sie müssen den CMake-Cache löschen, um das Ergebnis von' find_package() 'zu regenerieren. – Tsyvarev

Antwort

1

die folgenden Flags in Ihrem CMakeLists.txt Hinzufügen löst das Problem:

add_definitions(-DBOOST_ALL_NO_LIB) 
add_definitions(-DBOOST_ALL_DYN_LINK) 
Verwandte Themen