2012-01-18 14 views
5

Mi pregunta es una extensión de this questiong ++ enlazador no reconoce -Bstatic

quiero enlazar con bibliotecas 2 - foo y bar prefiriendo estática para foo y dinámica para la barra. Si uso

g++ -static -lfoo -lbar 

intenta encontrar archivos estáticos tanto para foo como para la barra. Cuando cambio el comando para

g++ -Wl,-Bstatic -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed 

según la pregunta anterior es así, este es el error que consigo:

ld: unknown option: -Bstatic 

Actualización: estoy usando OS X, si hay alguna diferencia

+0

try '-Wl, -static' también – nos

+1

Obtengo este' ld: advertencia: inesperado dylib (/path/to/libfoo.dylib) en la línea de enlace'. También esta .a en ese mismo lugar. Borré manualmente el dylib, y ahora 'ld' está obligado a recoger .a. Pero esa no debería ser la solución porque '-Wl, -static' se supone que hace la desambiguación, no yo –

Respuesta

5

¿Estamos lidiando con el enlazador GNU aquí? ¿Puedes mostrarnos la salida de "ld -v"?

EDIT: que no se parece a la ld de GNU, por eso la opción -Bstatic no se reconoce. Y parece que el disco de Apple no es compatible con la mezcla de bibliotecas estáticas y dinámicas muy bien; mira esto: Mixed static and dynamic link on Mac OS.

+0

$ ld -v @ (#) PROGRAMA: ld PROYECTO: ld64-127.2 llvm versión 3.0svn, de Apple Clang 3.0 (compilación 211.10.1) –

+0

+1 ¡Gracias por la explicación! ¿Hay alguna manera de elegir un enlazador que no sea de Apple? –

+0

Parece que no es posible usar el enlazador GNU ([¿Cómo instalar gnu ld en mac os x 10.6?] (Http://stackoverflow.com/questions/1608009/how-to-install-gnu-ld-on- mac-os-x-10-6)), que básicamente indica que debe mover archivos para mezclar bibliotecas compartidas y estáticas: S –

0

Sí, desafortunadamente, usar OS X hace la diferencia. -static le pide al compilador que le proporcione un ejecutable vinculado de forma estática (no compatible con OS X), y como Adiel señaló, -Wl, -Bstatic para mezclar enlaces estáticos y dinámicos no es compatible con el vinculador de clang de Apple.

Para solucionar este problema en el intento Mac:

g++ myapp.cpp libfoo.a libbar.a

como la línea de compilación (donde los nombres de bibliotecas siguen su fuente en la línea de comandos). Esto le dará myapp enlazado estáticamente con las bibliotecas foo y bar, mientras que otras bibliotecas necesarias se vincularán de forma dinámica.