Esta es una vieja pregunta, pero nadie parece haber mencionado esto.
Estabas teniendo suerte de que la cosa estaba vinculando a todos.
Usted necesita para cambiar
g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp
a esto:
g++ -g -Wall -o my_binary -L/my/dir bar.cpp -lfoo
Su enlazador realiza un seguimiento de los símbolos que necesita para resolver. Si lee primero la biblioteca, , no tiene ningún símbolo necesario, por lo que ignora los símbolos que contiene. Especifique las bibliotecas después de las cosas que necesitan para vincularlas, de modo que su enlazador tenga símbolos para encontrar en ellas.
Además, -lfoo
hace que busque específicamente un archivo llamado libfoo.a
o libfoo.so
según sea necesario. No libfoo.so.0
. Entonces ln
el nombre o cambie el nombre de la biblioteca según corresponda.
Para citar la página man gcc:
-l library
...
It makes a difference where in the command you
write this option; the linker searches and processes
libraries and object files in the order they are
specified. Thus, foo.o -lz bar.o searches library z
after file foo.o but before bar.o. If bar.o refers
to functions in z, those functions may not be loaded.
Agregar el archivo directamente a la línea de comandos g++
's debería haber funcionado, a menos, por supuesto, lo pones antes de bar.cpp
, provocando que el enlazador ignorar por carecer de los símbolos necesarios, porque todavía no se necesitaban símbolos.
¿Qué otros archivos 'libfoo. *' Existen y dónde - '.so' sin los' .0', '.a', etc etc.? –