recomendaciones para niños los lectura jovenes habito fomentar estrategias como casa aula adultos c unix linker fortran sgi

para - ¿Cómo puedo averiguar qué biblioteca es el hogar de un objeto determinado?



estrategias para fomentar la lectura en el aula (5)

Puede usar el comando nm para enumerar los símbolos dinámicos de una biblioteca compartida:

nm -D /lib/libc.so.6

y luego grep para el símbolo que está buscando. Omita el -D para bibliotecas estáticas. Puede usar esto en un bucle o con xargs para escanear múltiples bibliotecas.

Usualmente solo uso google (suponiendo que el símbolo es de una biblioteca públicamente disponible).

Estoy programando en FORTRAN y C en un SGI con Irix 6.5, pero esto debería ser aplicable a todos los sistemas tipo Unix. ¿Cómo encuentro la biblioteca que necesito vincular a mi programa cuando recibo un error de enlace "símbolo de texto no resuelto"? Aquí hay un ejemplo de lo que estoy viendo desde el enlazador:

ld32: ERROR 33 Unresolved text symbol "ortho2_" -- first referenced by ./libfoo.a

¿Tengo que saber qué bibliotecas son necesarias, o hay alguna herramienta o comando que pueda ayudarme a resolver esto?


Resistí la tentación de agregar esto a la respuesta de Robert Gamble. Considere esto como un suplemento.

Tenga cuidado de simplemente suponer que ''cualquier coincidencia'' está bien para su uso. Hubo un caso en otra pregunta de SO en la que un fragmento de código se movió de Windows a Unix y el código de Windows usó getch() para leer un solo carácter de la entrada. El usuario pasó por un proceso análogo a este y encontró getch() en Unix en la biblioteca de curses . Entonces, el usuario se vinculó con la biblioteca de curses y se preguntó por qué se descargó el núcleo del código. El problema es que el getch() realmente utilizado asume que se ha realizado la inicialización adecuada y no se realizó la inicialización adecuada. De hecho, probablemente no era la rutina necesaria.

En Solaris, hay opciones para nm que le indican el nombre de la biblioteca e incluso el archivo de objeto dentro de la biblioteca que contiene el símbolo (estos son -r para el nombre de la biblioteca y -R para el objeto dentro de la biblioteca).

Cuidado con los nombres desquiciados de C ++ también. El ejemplo de ortho2 claramente no es C ++ mutilado.


Si se trata de una función estándar, que podría ser ortho2, la página man le dirá en qué biblioteca se encuentra.


Tengo un pequeño script lookfor. Ingrese lookfor func_name

#!/bin/csh foreach i (*.o *.a *.so) echo $i nm $i | grep -i $1 end


Usar nm (como en la respuesta de Robert Gamble ) es la respuesta correcta a tu pregunta. El truco está en saber dónde buscar las bibliotecas. ¿Qué hace tu programa? Si hay una gran cantidad de datos numéricos, es probable que deba vincularse con bibliotecas matemáticas (como LAPACK o BLAS) y que desee comenzar a buscar allí. La búsqueda web también puede ser útil: escribí "orto2" en mi motor de búsqueda favorito y obtuve esta documentación que sugiere que está en libfgl.a

Tenga en cuenta que cuando realice una búsqueda, probablemente omita el guión bajo final; generalmente, el compilador lo agrega al nombre de la rutina.