2009-11-06 12 views
53

Tengo un archivo de biblioteca estática llamado libunp.a, sé que podría usar gcc -lunp xx para vincular a la biblioteca.#pragma comment (lib, "xxx.lib") equivalente en Linux?

Podría usar #pragma comment(lib,"xxx.lib") para decirle al compilador de Microsoft C/C++ que incluya la biblioteca; ¿Cómo podría hacerlo bajo Linux/GCC?

Respuesta

-4

Simple; no puedes GCC no tiene tal equivalente. Especifique -l como un parámetro gcc, cree un script del enlazador, llame al ld, llame al 911 o lo que sea.

No es que tal pragma tenga sentido. Las bibliotecas deben especificarse durante el paso de enlace. Tal información simplemente no pertenece dentro de una unidad de traducción. Una unidad de traducción puede ser preprocesada, compilada y ensamblada incluso sin una etapa de enlace. La cadena de herramientas utilizada por Visual Studio permite esto porque es braindead y siempre realiza el enlace.

Es posible que desee ahorrar un poco tediosa de escribir y crear un Makefile para su proyecto: GNU Make Manual

+78

Durante las últimas décadas, los programadores han popularizado el diseño de archivos .h y archivos .lib para tener algún tipo de relación entre ellos. En tal caso, tiene sentido que un archivo .h contenga un pragma que le indique al vinculador que vincule el archivo .lib correspondiente. Seguro que gcc no lo tiene, pero eso no significa que no tenga sentido. –

+7

Entonces asume que las bibliotecas no requieren ninguna ruta adicional ni banderas durante la vinculación. Esto es principalmente cierto en Windows, por lo tanto, el pragma 'funciona' en el entorno de Visual Studio. Otros pragmas de gcc son al menos consistentes en diferentes sabores de Linux/Solaris/BSD siempre que use la misma versión de gcc. Los caminos son, sin embargo, no. Por eso tiene todo el sentido separar la etapa de compilación en las secuencias de comandos de configuración o los archivos MAKE. No tiene nada que ver dentro de las unidades de traducción. Intente portar el software en algún momento ;-) –

+34

@Mads: El hecho de que Unix es una plataforma fracturada que requiere la separación de las fases de compilación y enlace, y todo el dolor que eso conlleva, no es una justificación para destrozar la forma en que Windows lo hace. que es mucho más fácil de tratar y permite a los implementadores de bibliotecas quitarle ese dolor a sus usuarios. La idea de que el enfoque de Unix es más difícil pero mejor es puro masoquismo irracional. –

14

No parece haber ninguna mención de ningún pragma equivalente en el GCC manual's page on pragmas.

Una razón que vi para que GCC no admitiera la vinculación en el código fuente era que a veces, correct linking depends on link order; y esto requeriría que se asegure de que el orden de enlace se produzca correctamente, sin importar el orden de compilación. Si vas a hacer tanto trabajo, también puedes pasar los argumentos del enlazador en la línea de comando (o de lo contrario), supongo.

+2

Lo mismo aplica para algunos, si no para todos los compiladores de Windows. Pero sí, tales pragmas son __bad__ –

+6

"la compilación correcta depende del orden del enlace". - No, como dice el artículo vinculado, el ENLACE correcto depende del orden del enlace. –

18

Las bibliotecas deben ser especificados durante la etapa de vinculación. Tal información simplemente no pertenece dentro de una unidad de traducción. Una unidad de traducción puede ser preprocesada, compilada y ensamblada incluso sin una etapa de vinculación.

Simplemente porque #pragma comment(lib,"xxx.lib") está en el archivo de origen no significa que el compilador lo consume. De hecho, entra como un comentario y luego es utilizado por el enlazador. No es muy diferente de * nix.

+2

No tiene toda la razón, hay algunos casos como usar ROOT (root.cern.ch) donde podría ser muy útil. – RSFalcon7