referencia indefinida a `boost::program_options::options_description::m_default_line_length’

5 minutos de lectura

Avatar de usuario de Picowhat
Picoqué

Estoy tratando de compilar un código y me sale el error.

referencia indefinida a boost::program_options::options_description::m_default_line_length

Uso g ++ en Ubuntu 12.04. Aunque he hecho algo de programación en C++, soy nuevo en el entorno de desarrollo de Linux (anteriormente solo usaba IDE).

Así que hice una búsqueda básica de este problema y encontré algunos problemas de vinculación. No los entendí muy bien ya que soy un novato. Leer algunas de esas soluciones me confundió aún más. Mi carpeta de la biblioteca boost está en /usr/include. Algunas soluciones dicen que debería estar en /usr/lib. Pero no tengo ninguna carpeta boost allí.

¿Qué necesito cambiar?

  • abre una terminal y escribe updatedb && locate libboost_program_options. que encontrará la ruta donde instaló los archivos lib para impulsar.

    – defecto

    29 de agosto de 2012 a las 13:45


  • localizar libboost_program_options no devuelve nada, pero como dije, la carpeta boost está en /usr/include y también tiene una carpeta de opciones de programa

    – Picoqué

    29 de agosto de 2012 a las 14:10


  • OOps, lo siento, acabo de ver esa edición ahora. Ejecuté ese comando y obtuve este error actualizado: no se puede abrir un archivo temporal para `/var/lib/mlocate/mlocate.db

    – Picoqué

    29 de agosto de 2012 a las 14:12

  • podría necesitar sudo… también puede localizar el archivo con el find comando, pero encuentro el locate comando para ser mucho más fácil de usar. la updatedb El comando simplemente actualiza la base de datos que locate usos

    – defecto

    29 de agosto de 2012 a las 14:13


  • Tengo MATLAB instalado. Ahora que el comando de localización muestra que el archivo está en /usr/local/MATLAB/R2011a/bin/glnx86/libboost_program_options.so.1.40.0

    – Picoqué

    29 de agosto de 2012 a las 14:20


Avatar de usuario de Neel Basu
neel basu

Si ha instalado boost from repo solo use -lboost_program_options eso será suficiente.
Si instaló bibliotecas boost en alguna otra biblioteca, debe especificar ese directorio por -L/path/to/lib

En CMake puede especificar set(CMAKE_CXX_FLAGS "-lboost_program_options")

Sin embargo, con CMake deberías usar

FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(target ${Boost_LIBRARIES})

  • Lo instalé desde el repositorio, pero -lboost_program_options me da un error /usr/bin/ld: no se puede encontrar -lboost_program_options

    – Picoqué

    29 de agosto de 2012 a las 14:07


  • En CMake deberías usar find_package(Boost ... para localizar Boost y usar target_link_libraries para especificar bibliotecas; esto ayuda al migrar a otros compiladores/OS.

    – Silas Parker

    29 de agosto de 2012 a las 14:08

  • bueno en mi sistema solo -lboost_program_options obras. @user1633316: puedes hacer una búsqueda de libboost-* archivos dar ese camino con -L en nota, ¿instaló las opciones del programa desde el repositorio?

    – Neel Basu

    29 de agosto de 2012 a las 14:10


  • Para OSX con bibliotecas boost de MacPorts, use -lboost_program_options-mt

    – Josh Petit

    26 de enero de 2014 a las 1:52

  • Se corrigió esto en Ubuntu 14.04 solo después de instalar libboost1.55-all-dev

    – Schuh

    13 de marzo de 2016 a las 12:20

Hubo cambios en el <string> class en el estándar C++11 que puede entrar en conflicto con las versiones de la biblioteca Boost que se compilaron con un compilador que no es C++11 (como G++-4.8). Intente volver a compilar boost o usar una versión del compilador de C++ que se usó para compilar sus bibliotecas de Boost.

  • ¡Esto me llevó por el buen camino! Necesitaba compilar mis cosas con g++-5 en vez de g++-4.8. Probablemente no sea bueno que Ubuntu 16.04 tenga g++-4.8 por defecto g++ compilador mientras que las bibliotecas de C++ que ofrece obviamente se compilan a través de g++-5.

    – Gerhard Hagerer

    14 de diciembre de 2016 a las 11:09

También verifique que la configuración de la variable de preprocesador _GLIBCXX_USE_CXX11_ABI es idéntica a la configuración de la variable que se utilizó para compilar boost. La configuración predeterminada de la variable puede ser diferente según la distribución de Linux y la versión del compilador GNU utilizado.

Ver Doble ITB para más información.

¿Dónde están las bibliotecas boost (archivos que terminan en .so y .a)? Encuéntrelos, luego agregue esto a su comando de enlace: -L/path/to/boost/libs -lname-of-boost-lib

Este tiene que ser el problema más común que enfrentan las personas cuando inician C++ por primera vez. Probablemente hay mil otras preguntas de referencia no definidas sobre SO. Simplemente busque una referencia indefinida.

Tuve el mismo problema y luché durante mucho tiempo y nada funcionó… pero la solución fue muy simple.

Primero, ejecuta apt install libboost-all-dev. Una vez completado esto, ejecutar whereis libboost_program_options debe producir una salida similar a

libboost_program_options: /usr/lib/x86_64-linux-gnu/libboost_program_options.so /usr/lib/x86_64-linux-gnu/libboost_program_options.a

Una vez hecho esto (y sé que esto es una tontería, pero) asegúrese de vincular las bibliotecas en el orden correcto, es decir, después de sus archivos fuente.

En mi caso, estaba ejecutando g++ -lboost_program_options main.cpp en vez de g++ main.cpp -lboost_program_options y NADA funcionó, ni una sola solución que pude encontrar (y tuve el error exacto como se menciona en la publicación). Son dos días de mi vida desperdiciados y realmente espero que alguien encuentre esta respuesta y se ahorre algunos problemas.

Avatar de usuario de Toby Speight
Toby Speight

Las bibliotecas normalmente se instalan en /usr/lib (por ejemplo, en mi sistema, /usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.58.0).

Para compilar el código que se vinculará con esas bibliotecas, normalmente usa los archivos de encabezado, proporcionados en /usr/include.

A diferencia de muchas bibliotecas, Boost no viene con archivos pkg-config, por lo que debe agregar las banderas del enlazador usted mismo. Con las reglas habituales de Makefile, necesitará algo como LDLIBS += -lboost_program_options.

Nótese también que, aunque el libboost-dev paquete proporciona los encabezados para program_optionstambién necesita instalar libboost-program-options-dev para obtener la biblioteca correspondiente.

¿Ha sido útil esta solución?