c++ visual-c++ boost filesystems linker

c++ - boost download



¿Cómo puedo resolver el error LNK1104 con Boost Filesystem Library en MSCV? (7)

El error que ha publicado se queja del archivo libboost_system-vc90-mt-gd-1_37.lib, pero en el directorio solo tiene libboost_ file system-vc90-mt-gd-1_37.lib, ¿verdad?

Busque libboost_system-vc90-mt-gd-1_37.lib. Si lo encuentra, agregue el directorio correspondiente a la ruta de búsqueda de la biblioteca. Si no lo encuentra, vea si tiene boost_system-vc90-mt-gd-1_37.lib en su lugar (como yo), e intente copiar eso al nombre de archivo deseado.

Tengo problemas para hacer que mi proyecto se vincule con el archivo lib del sistema de archivos Boost (versión 1.37.0) en Microsoft Visual C ++ 2008 Express Edition. La biblioteca del sistema de archivos no es una biblioteca de solo encabezado. He estado siguiendo la guía Getting Started on Windows publicada en la página web oficial de boost. Estos son los pasos que he tomado:

  1. Utilicé bjam para construir el conjunto completo de archivos lib usando:

    bjam --build-dir="C:/Program Files/boost/build-boost" --toolset=msvc --build-type=complete

  2. Copié el directorio / libs (ubicado en C: / Program Files / boost / build-boost / boost / bin.v2 ) a C: / Program Files / boost / boost_1_37_0 / libs.

  3. En Visual C ++, en Proyecto> Propiedades> Directorios de biblioteca adicionales agregué estas rutas:

    • C: / Archivos de programa / boost / boost_1_37_0 / libs
    • C: / Archivos de programa / boost / boost_1_37_0 / libs / filesystem / build / msvc-9.0express / debug / link-static / threading-multi

    Agregué el segundo por desesperación. Es el directorio exacto donde reside libboost_system-vc90-mt-gd-1_37.lib .

  4. En Propiedades de configuración> C / C ++> General> Incluir directorios adicionales, agregué la siguiente ruta:

    • C: / Archivos de programa / boost / boost_1_37_0
  5. Luego, para poner la guinda del pastel, en Tools> Options VC ++ Directories> Library files , agregué los mismos directorios mencionados en el paso 3.

A pesar de todo, cuando construyo mi proyecto, aparece el siguiente error:

fatal error LNK1104: cannot open file ''libboost_system-vc90-mt-gd-1_37.lib''

Además, aquí está el código que estoy intentando compilar, así como una captura de pantalla del directorio mencionado donde reside el archivo lib (supuestamente correcto):

#include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations #include <iostream> // for std::cout using boost::filesystem; // for ease of tutorial presentation; // a namespace alias is preferred practice in real code using namespace std; int main() { cout << "Hello, world!" << endl; return 0; }


La línea de comando bjam debería haber construido todas las versiones de todas las bibliotecas. Aún así, cuando construyes con

bjam --build-dir="C:/Program Files/boost/build-boost" --toolset=msvc --build-type=complete stage

(nótese el stage al final) todas las bibliotecas se copian en una carpeta / libs común, de modo que la característica de autolinking de MSVC funciona cuando solo agrega esta libs / carpeta a su ruta de biblioteca.

No sé si bjam sin stage aún copia todos esos archivos en una sola carpeta. De lo contrario, ejecute una compilación de stage para hacer esto. Si son, bueno, lo siento, la configuración parece correcta, ¿tal vez un pequeño error de tipeo en alguna parte?


La respuesta de Ferruccio contiene la mayor parte de la comprensión. Sin embargo, Pukku me hizo darme cuenta de mi error. Estoy publicando mi propia respuesta para dar una explicación completa. Como explicó Ferruccio, Filesystem depende de dos bibliotecas. Para mí, estos son:

  • libboost_system-vc90-mt-gd-1_37.lib
  • libboost_filesystem-vc90-mt-gd-1_37.lib

No debí haber notado que cuando proporcioné el directorio para libboost_filesystem-vc90-mt-gd-1_37.lib , el resultado del error cambió de

fatal error LNK1104: cannot open file ''libboost_filesystem-vc90-mt-gd-1_37.lib''

a

fatal error LNK1104: cannot open file ''libboost_system-vc90-mt-gd-1_37.lib''

Causando que piense que el error persiste. Esto me llevó a publicar información bastante inexacta. Además, después de leer que Filesystem requiere dos bibliotecas, ahora veo la importancia de la etapa de palabra clave para el comando bjam. Abastecimiento

bjam --build-dir="C:/Program Files/boost/build-boost" --toolset=msvc --build-type=complete stage

Hace que bjam coloque un directorio adicional, adecuadamente llamado stage , en el directorio boost_1_37_0 . Esta carpeta contiene una carpeta llamada / lib , que tiene copias de todos los archivos lib en un solo lugar. Esto es conveniente para Visual C ++ porque puede suministrarlo con este único directorio y se ocupará de todas las dependencias.


boost :: filesystem depende de boost :: system, por lo que necesita ambas rutas.

Parte del problema es que está utilizando las bibliotecas de refuerzo fuera de los directorios de compilación en lugar del directorio de instalación (el proceso de compilación de impulso debería crear ambas). El directorio install / lib tiene todas las librerías, por lo que solo necesita especificar una ruta.

El proceso de compilación impulso construye cada biblioteca en su propio directorio. Al final, copia todos esos archivos .lib en un directorio lib común.

Como no especificó un directorio de instalación como parte de su comando de compilación (con --prefix = ...), creo que el valor predeterminado es C: / Boost. Compruebe si ese directorio está allí y, de ser así, utilice C: / boost / include / boost-1_37 para su ruta de inclusión y C: / boost / lib para la ruta de acceso de la biblioteca.


Tuve el mismo problema, lo que debe hacer es agregar el directorio "lib" en la carpeta de impulso de nivel superior a la ruta de la biblioteca en Visual C ++.

Esto definitivamente resolvió el problema para mí.


Creo que el verdadero problema original está relacionado con el proceso de compilación boost por defecto en Windows que espera el enlace estático de una biblioteca que tendrá un nombre que beginning libboost_sytem<etc..> . La macro que necesitas es

#define BOOST_SYSTEM_DYN_LINK

lo que garantiza que la biblioteca Boost.System esté vinculada dinámicamente. El nombre de la biblioteca dinámica es boost_system<etc...> como apposed la biblioteca estática libboost_sytem<etc...>


La última respuesta es correcta. Pero deberías encontrar el archivo de configuración boost $ BOOST / config / user.hpp y descomentar esta directiva #define BOOST_ALL_DYN_LINK. Ahora comienza a usar un enlace dinámico con boost y debería funcionar.