2012-10-03 16 views
6

Ho compilato Boost 1.51.0 su Windows utilizzando il build CLang di rubenvb. Io in realtà compilato b2 usando MinGW:Ricerca di Boost compilato con CLang con CMake

bootstrap mingw 
... compiling b2 using mingw... 

e poi ho compilato le librerie con clang:

b2 toolset=clang stage --stagedir=. --build-type=complete --with-regex ... 

A proposito, anche se ho specificato --build-type=complete non ci sono DLL nella directory lib, ma ho letto da qualche parte che CLang ha ancora problemi con il collegamento su Windows, quindi questa potrebbe essere la ragione. Comunque le librerie statiche vanno bene per me. Ho ottenuto questi file nella %BOOST_ROOT%\lib:

libboost_regex-clang31-1_51.lib 
libboost_regex-clang31-d-1_51.lib 
libboost_regex-clang31-mt-1_51.lib 
libboost_regex-clang31-mt-d-1_51.lib 
libboost_regex-clang31-mt-s-1_51.lib 
libboost_regex-clang31-mt-sd-1_51.lib 
libboost_regex-clang31-s-1_51.lib 
libboost_regex-clang31-sd-1_51.lib 

Ora, se compilo qualcosa con clangore da linea di comando tutto funziona. Il problema mostra quando provo a far trovare a CMake le librerie Boost: semplicemente non le trovo. Ho provato con questo CMakeFiles.txt:

cmake_minimum_required (VERSION 2.8) 
project(ccc) 

# Setting/unsetting this does not change anything. 
set(Boost_USE_STATIC_LIBS ON) 

find_package(Boost COMPONENTS regex REQUIRED) 

include_directories(${Boost_INCLUDE_DIR}) 
link_directories(${Boost_LIBRARY_DIRS}) 

add_executable(ccc main.cpp) 

target_link_libraries(ccc 
    ${Boost_REGEX_LIBRARY} 
    ) 

Costruire usando MinGW (e una MinGW versione compilata di Boost) funziona. Se provo con Clang (dopo aver impostato CC=clang, CXX=clang++ e BOOST_ROOT=C:/misc/boost/clang-1_51_0) non è così:

D:\Desktop\ppp>cmake -G "MinGW Makefiles" ..\ccc 
-- The C compiler identification is Clang 3.1.0 
-- The CXX compiler identification is Clang 3.1.0 
-- Check for working C compiler: C:/misc/clang/bin/clang.exe 
-- Check for working C compiler: C:/misc/clang/bin/clang.exe -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler: C:/misc/clang/bin/clang++.exe 
-- Check for working CXX compiler: C:/misc/clang/bin/clang++.exe -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
CMake Error at C:/misc/cmake/share/cmake-2.8/Modules/FindBoost.cmake:1191 (message): 
    Unable to find the requested Boost libraries. 

    Boost version: 1.51.0 

    Boost include path: C:/misc/boost/clang-1_51_0 

    The following Boost libraries could not be found: 

      boost_regex 

    No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the 
    directory containing Boost libraries or BOOST_ROOT to the location of 
    Boost. 
Call Stack (most recent call first): 
    CMakeLists.txt:5 (find_package) 


CMake Error: The following variables are used in this project, but they are set to NOTFOUND. 
Please set them or make sure they are set and tested correctly in the CMake files: 
Boost_REGEX_LIBRARY (ADVANCED) 
    linked by target "ccc" in directory D:/Desktop/ccc 

-- Configuring incomplete, errors occurred! 

Tuttavia, se compilo manualmente funziona di nuovo:

clang++ main.cpp -I%BOOST_ROOT% -L%BOOST_ROOT%\lib -llibboost_regex-clang31-1_51 
...Ok, and the executable works 

Impostazione manuale BOOST_LIBRARYDIR non funziona neanche . Non utilizza nemmeno i backslash \.

risposta

5

Guardando all'interno del file "C: /misc/cmake/share/cmake-2.8/Modules/FindBoost.cmake" è possibile trovare un elenco di tutte le variabili relative a Boost che è possibile utilizzare. Quello che vi serve è Boost_COMPILER (Boost_DETAILED_FAILURE_MSG può anche essere utile per la diagnosi dei problemi):

# Boost_COMPILER    Set this to the compiler suffix used by Boost 
#        (e.g. "-gcc43") if FindBoost has problems finding 
#        the proper Boost installation 
+1

Impostazione 'Boost_COMPILER' a' -clang31' * e * 'Boost_USE_STATIC_RUNTIME' a' true' ha risolto il problema. Grazie. – Claudio