Considere el siguiente escenario:
- Biblioteca compartida libA.so, sin dependencias.
- Biblioteca compartida libB.so, con libA.so como su dependencia.
Quiero compilar un archivo binario que se vincule con libB. ¿Debo vincular el binario solo con libB o con libA tampoco?
¿Hay alguna forma de vincular solo con las dependencias directas, permitiendo la resolución de símbolos no resueltos de las dependencias para el tiempo de ejecución?
Me preocupa el hecho de que la implementación de la biblioteca libB pueda cambiar en el futuro, introduciendo otras dependencias (libC, libD, libE, por ejemplo). ¿Voy a tener problemas con eso?
En otras palabras:
- Archivos libA: a.cpp ah
- archivos libB: b.cpp bh
- archivos del programa principal: main.cpp
Por supuesto, b.cpp incluye ah y main.cpp incluye bh
Comandos de compilación:
g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o
g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA
¿Cuál de las siguientes opciones debo utilizar?
g++ main.cpp -o main -I. -L. -lB
o
g++ main.cpp -o main -I. -L. -lB -lA
No pude usar la primera opción. El enlazador se queja de los símbolos no resueltos de la biblioteca libA. Pero me suena un poco extraño.
Muchas gracias.
- Comentarios actualizados:
Cuando vinculo el binario, el vinculador intentará resolver todos los símbolos del principal y del libB. Sin embargo, libB tiene símbolos indefinidos de libA. Es por eso que el enlazador se queja de eso.
Por eso también necesito vincularme con la libA. Sin embargo, encontré una manera de ignorar los símbolos no resueltos de las bibliotecas compartidas. Parece que debería usar la siguiente línea de comando para hacer eso:
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
Parece que todavía es posible utilizar la -rpath
opción. Sin embargo, necesito entenderlo un poco mejor.
¿Alguien conoce los posibles obstáculos al usar la -Wl,-unresolved-symbols=ignore-in-shared-libs
opción?
- Comentarios actualizados 2:
-rpath
no debe utilizarse para este propósito. Es útil forzar la búsqueda de una biblioteca en un directorio determinado. El -unresolved-symbol
enfoque se ve mucho mejor.
Gracias de nuevo.