2011-07-11 13 views

Respuesta

124

poner esto en su archivo CMakeLists.txt (cambiar cualquier opción de OFF a ON si lo desea):

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost 1.45.0 COMPONENTS *boost libraries here*) 

if(Boost_FOUND) 
    include_directories(${Boost_INCLUDE_DIRS}) 
    add_executable(progname file1.cxx file2.cxx) 
    target_link_libraries(progname ${Boost_LIBRARIES}) 
endif() 

Obviamente se necesita para poner las bibliotecas que desea donde pongo *boost libraries here*. Por ejemplo, si está utilizando la biblioteca filesystem y regex que iba a escribir:

find_package(Boost 1.45.0 COMPONENTS filesystem regex) 
+1

Tenga en cuenta que no necesita especificar componentes para bibliotecas solo de encabezado, como 'lexical_cast'. Por lo tanto, solo necesita el comando 'find_package' y' include_directories'. –

+1

En Windows, también puede ayudar agregar esto a su archivo cmake: ADD_DEFINITIONS (-DBOOST_ALL_NO_LIB) de lo contrario, puede toparse con http://stackoverflow.com/questions/28887680/linking-boost-library-with-boost-use- static-lib-off-on-windows –

+0

¿es posible establecer BOOST_USE_STATIC_LIBS en ON y Boost_USE_STATIC_RUNTIME en OFF? & viceversa. – squid

68

Puede utilizar find_package para buscar bibliotecas Boost disponibles. Demora la búsqueda de Boost en FindBoost.cmake, que está instalado por defecto con CMake.

Al encontrar Boost, la llamada find_package() habrá rellenado muchas variables (consulte la referencia para FindBoost.cmake). Entre ellos se encuentran BOOST_INCLUDE_DIRS, Boost_LIBRARIES y Boost_XXX_LIBRARY variabels, con XXX reemplazado por bibliotecas específicas de Boost. Puede usarlos para especificar include_directories y target_link_libraries.

Por ejemplo, supongamos que se necesita impulso :: program_options e impulsar :: expresiones regulares, que haría algo como:

find_package(Boost REQUIRED COMPONENTS program_options regex) 
include_directories(${Boost_INCLUDE_DIRS}) 
add_executable(run main.cpp) # Example application based on main.cpp 

# Alternatively you could use ${Boost_LIBRARIES} here. 
target_link_libraries(run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY}) 

Algunos consejos generales:

  • Al buscar, comprueba el FindBoost variable de entorno $ ENV {BOOST_ROOT}. Puede establecer esta variable antes de llamar a find_package si es necesario.
  • Cuando tiene múltiples versiones de compilación de boost (multiproceso, estático, compartido, etc.) puede especificar la configuración deseada antes de llamar a find_package. Para ello, establezca algunas de las siguientes variables en On: Boost_USE_STATIC_LIBS, Boost_USE_MULTITHREADED, Boost_USE_STATIC_RUNTIME
  • Al buscar Boost en Windows, tenga cuidado con el autovínculo. Lea la "NOTA para usuarios de Visual Studio" en el reference.
    • Mi consejo es desactivar el auto-vinculación y manipulación dependencia utilización de cmake: add_definitions(-DBOOST_ALL_NO_LIB)
    • En algunos casos, puede que tenga que especificar explícitamente que se utiliza un refuerzo dinámico: add_definitions(-DBOOST_ALL_DYN_LINK)
+3

Gracias por los consejos generales. Ellos me ayudaron mucho. –

+0

¡Respuesta increíblemente útil! Me hubiera ahorrado mucho tiempo si hubiera encontrado esto hace dos años. Gran reseña. – Ela782

2

Estoy de acuerdo con las respuestas 1 y 2. Sin embargo, prefiero especificar cada biblioteca por separado. Esto hace que las dependencias sean más claras en los grandes proyectos. Sin embargo, existe el peligro de escribir mal los nombres de las variables (sensibles a las mayúsculas y minúsculas). En ese caso, no hay un error directo de cmake, pero algunas referencias indefinidas del enlazador se publican más adelante, lo que puede tardar un tiempo en resolverse.Por lo tanto, utilizar la siguiente función cmake:

function(VerifyVarDefined) 
    foreach(lib ${ARGV}) 
    if(DEFINED ${lib}) 
    else(DEFINED ${lib}) 
     message(SEND_ERROR "Variable ${lib} is not defined") 
    endif(DEFINED ${lib}) 
    endforeach() 
endfunction(VerifyVarDefined) 

Para el ejemplo mencionado anteriormente, esto se parece a:

VerifyVarDefined(Boost_PROGRAM_OPTIONS_LIBRARY Boost_REGEX_LIBRARY) 
target_link_libraries(run ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY}) 

Si hubiera escrito "BOOST_PROGRAM_OPTIONS_LIBRARY" no habría habido un error provocado por cmake y no mucho más tarde desencadenado por el enlazador.

5

Adaptación @ respuesta de LainIwakura para la sintaxis CMake moderna con objetivos importados, esto sería:

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost 1.45.0 COMPONENTS filesystem regex) 

if(Boost_FOUND) 
    add_executable(progname file1.cxx file2.cxx) 
    target_link_libraries(progname Boost::filesystem Boost::regex) 
endif() 

en cuenta que no es necesario más para especificar los directorios incluir manualmente, puesto que ya es atendido a través de la objetivos importados Boost::filesystem y Boost::regex.
regex y filesystem pueden ser reemplazados por cualquier biblioteca de impulso que necesite.

+1

¿Cómo se vería si quisieras decir que se vincule con todo el impulso? Quiero decir sin enumerar todas las bibliotecas hay impulso. –

+1

Si solo usa partes de impulso con encabezado, 'Boost :: boost' será suficiente. Todas las bibliotecas compiladas de impulso deben especificarse explícitamente. – oLen

0

Puede ser útil para algunas personas. Tenía un error de traviesa: referencia indefinida a símbolo //usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0 '_ZN5boost6system15system_categoryEv': error símbolos añadiendo: DSO falta de línea de comandos Hubo algunos cuestión de cmakeList.txt y de alguna manera me faltaba incluir explícitamente las bibliotecas "sistema" y "sistema de archivos". Entonces, escribí estas líneas en CMakeLists.txt

Estas líneas se escriben al principio antes de crear el ejecutable del proyecto, ya que en esta etapa no es necesario vincular la biblioteca de impulso a nuestro ejecutable del proyecto.

set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
set(Boost_NO_SYSTEM_PATHS TRUE) 

if (Boost_NO_SYSTEM_PATHS) 
    set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost") 
    set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include") 
    set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib") 
endif (Boost_NO_SYSTEM_PATHS) 


find_package(Boost COMPONENTS regex date_time system filesystem thread graph program_options) 

find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options) 
find_package(Boost COMPONENTS program_options REQUIRED) 

Ahora, al final del archivo, escribí estas líneas al considerar "KeyPointEvaluation" como mi proyecto ejecutable.

if(Boost_FOUND) 
    include_directories(${BOOST_INCLUDE_DIRS}) 
    link_directories(${Boost_LIBRARY_DIRS}) 
    add_definitions(${Boost_DEFINITIONS}) 

    include_directories(${Boost_INCLUDE_DIRS}) 
    target_link_libraries(KeyPointEvaluation ${Boost_LIBRARIES}) 
    target_link_libraries(KeyPointEvaluation ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY}) 
endif() 
Cuestiones relacionadas