una significa que para los imagenes imagen como atributos atributo agregar c++ visual-studio-2015 static-libraries linker-errors

c++ - para - que significa alt en una imagen



Enlace un programa a una biblioteca estática, vinculándose a otra biblioteca (1)

Estoy intentando crear un programa (C ++) que pueda leer múltiples formatos de archivo, en Windows (VS2015). Para hacer eso, creé una solución con un Proyecto para MyProgram (que es el programa principal) y un proyecto para MyLibrary (que contiene varios analizadores para diferentes formatos de archivo). En MyProgram creo algunos objetos del analizador basados ​​en la entrada del programa.

Todo estaba funcionando bien.

Sin embargo, traté de crear un nuevo analizador de formatos de archivo (NiftiParser) que utiliza una biblioteca externa, nifticlib, que descargué y compilé (como biblioteca estática).

Así que creé mi clase NiftiParser, que implementa algunos métodos, e internamente, llama a nifticlib. Agregué el directorio de inclusión y biblioteca en las propiedades del proyecto, y se compiló sin errores. Luego obtuve un Parser.lib que ha sido creado.

Sin embargo, cuando intenté compilar MyProgram, recibí un error acerca de que algunas funciones de la biblioteca nifticlib no se habían resuelto:

1>------ Build started: Project: Parser, Configuration: Debug x64 ------ 1> nifti_parser.cc 1> Parser.vcxproj -> C:/Users/Laurent/Documents/C++-build/Projects/Parser/Debug/Parser.lib 2>------ Build started: Project: MyProgram, Configuration: Debug x64 ------ 2>Parser.lib(nifti_parser.obj) : error LNK2019: unresolved external symbol nifti_image_read referenced in function "public: __cdecl NiftiParser::NiftiParser(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0NiftiParser@@QEAA@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 2>C:/Users/Laurent/Documents/C++-build/Projects/Debug/MyProgram.exe : fatal error LNK1120: 1 unresolved externals ========== Build: 1 succeeded, 1 failed, 3 up-to-date, 0 skipped ==========

No estoy seguro de entender por qué sucede esto. Traté de agregar la ruta de inclusión y el directorio de la biblioteca de nifticlib al proyecto MyProgram, pero todavía tengo algún problema.

No estoy seguro de entender cuál es el proceso de compilación / vinculación para Visual Studio (solía trabajar en Linux).

Me parece que los proyectos solo se compilan si se trata de una biblioteca estática, y la parte de enlace solo ocurre cuando intento compilar el programa. ¿Estoy en lo cierto?

Además, no estoy seguro de dónde debería unir nifticlib. ¿Debería ser para Parser.lib (donde uso las funciones de la biblioteca) o directamente para el programa?

Gracias.

PD: También noté que mi directorio de instalación de nifticlib solo contiene encabezados y .lib. ¿Necesito tener el .cpp allí también, o las funciones ya están contenidas en .lib?

Editar: Ok, aparentemente construir algo como una biblioteca estática no lo vincula a nada, así que esa es probablemente la razón por la cual no tuve ningún problema al compilar Parser.lib, porque no enlaza a nifticlib, pero MyProgram lo necesita. Entonces, ¿debería incluir el directorio de inclusión de nitficlib en mis proyectos de analizador y poner el Parser.lib y el nifticlib en mi proyecto MyProgram?


La compilación / vinculación de Visual Studio no difiere mucho de lo que está sucediendo en las cadenas de herramientas de Linux. Cuando está creando un archivo binario (un archivo ejecutable o una biblioteca dinámica), todos los símbolos externos deben resolverse. En GCC, debe indicar las bibliotecas a su vinculador. La opción de línea de comando -lmath le indicará a linker que cargue libmath.a desde una de las rutas establecidas para la búsqueda en la biblioteca y la use cuando construya su imagen ejecutable.

De forma similar, en VS no solo tiene que establecer la ruta a los directorios de la biblioteca, sino también indicar explícitamente el archivo de la biblioteca. Esto generalmente se hace en las propiedades del proyecto -> Enlazador -> Entrada -> Dependencias adicionales. Tenga en cuenta que en Windows simplemente pone el nombre completo de la biblioteca ( MyLib.lib ), no la parte entre lib y .a

También tenga en cuenta que en Windows no puede vincular al binario de una biblioteca dinámica (.dll). Necesitará una biblioteca de importación (.lib) para ello.

Cuando está creando una biblioteca estática, la cadena de herramientas no resuelve las referencias externas. Es por eso que .lib compiló bien sin hacer referencia al nifticlib.

En cuanto a dónde debe vincular el nifticlib, depende de las circunstancias. Si solo su MyLibrary alguna vez utilizará las funciones de nifticlib, es aconsejable vincularlo con su biblioteca estática. Sin embargo, si algún día desea usar alguna función de nifticlib directamente en MyProgram, puede haber un conflicto en el momento del enlace. En este caso, deberá vincular el nifticlib solo cuando construya MyProgram.

Una regla del pulgar puede formularse así:

  • Si solo MyLibrary está usando los encabezados de nifticlib, enlace su biblioteca con una de terceros
  • Si MyProgram también usa los encabezados de nifticlib (y en realidad llama a funciones de ellos), es mejor vincular el nifticlib al compilar MyProgram.

Esta no es una descripción estricta, y hay casos más complicados, pero los conceptos básicos son los siguientes.

Y no, no necesita los archivos cpp utilizados al construir su biblioteca estática, cuando está enlazando a esa biblioteca desde un proyecto diferente. El contenido de la biblioteca .cpp ya está incluido en el archivo lib estático en forma de código objeto.

Editar: si desea vincular su biblioteca estática con las externas de otra biblioteca estática, debe ir a las propiedades del proyecto -> Bibliotecario -> General -> dependencias adicionales y colocar el .lib externo allí