c gcc cmake linker-errors fann

Error "referencia indefinida a` sin ''"al compilar(con-lm)



gcc cmake (2)

Parece que está compilando su propio programa como de 64 bits, pero la biblioteca de FANN es de 32 bits. Es posible que necesite especificar una arquitectura para FANN al compilar, lo que puede significar la modificación de los indicadores de GCC en el archivo MAKE, a menos que haya configuraciones de autoconf para hacerlo por usted. Suponiendo que quiere FANN de 64 bits.

Alternativamente, podría especificar una arquitectura de 32 bits cuando compile su propio código.

He descargado y compilado: http://leenissen.dk/fann/wp/

  • Versión de cmake 2.8.11.2
  • gcc (Ubuntu / Linaro 4.8.1-10ubuntu8) 4.8.1

Comando utilizado para compilar:

cmake -D CMAKE_INSTALL_PREFIX:PATH=/usr .

Instalación:

sudo make && sudo make install

Luego voy a examples / directory dentro de fann project y trato de compilar ejemplos ejecutando:

make all

Me aparece un error:

gcc -O3 xor_train.c -o xor_train -lfann -lm /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `sin'' /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `exp'' /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `cos'' /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `log'' /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `pow'' /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `sqrt'' /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `floor'' collect2: error: ld returned 1 exit status make: *** [xor_train] Error 1

Actualizar:

  • He seguido una instrucción dada por una biblioteca
  • Revisé en otra máquina y proporcioné que la instrucción funciona según lo previsto, así que supongo que mi entorno está mal configurado de alguna manera.

Más información sobre las dependencias compartidas de la biblioteca:

ldd /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so linux-vdso.so.1 => (0x00007fff3abfe000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6f3997c000) /lib64/ld-linux-x86-64.so.2 (0x00007f6f39f84000)

Según lo sugerido por @ michael-burr compilado con -Wl, -v

/usr/bin/ld --sysroot=/ / --build-id --eh-frame-hdr -m elf_x86_64 / --hash-style=gnu --as-needed / -dynamic-linker /lib64/ld-linux-x86-64.so.2 / -z relro -o xor_train / /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o / /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o / /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o / -L/usr/lib/gcc/x86_64-linux-gnu/4.8 / -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu / -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib / -L/lib/x86_64-linux-gnu / -L/lib/../lib -L/usr/lib/x86_64-linux-gnu / -L/usr/lib/../lib / -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. / -v /tmp/cc0AHZgU.o -lfann -lm -lgcc --as-needed -lgcc_s --no-as-needed / -lc -lgcc --as-needed -lgcc_s --no-as-needed / /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o / /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o GNU ld (GNU Binutils for Ubuntu) 2.23.52.20130913


Causa raíz : dependencias faltantes en la biblioteca FANN (enviará un parche al autor). Tal dependencia se llama " dependencia entre bibliotecas ".

Puede suceder que uno cree una biblioteca compartida A y no tenga las dependencias correctas establecidas (digamos B ). En tal caso, se compilará una biblioteca compartida A sin ningún mensaje de error, ya que no es necesario proporcionar la implementación durante la compilación.

El problema aparecerá como una falta de biblioteca B cuando intente crear un archivo ejecutable que dependa de A.

En este caso específico, una solución es modificar un archivo de configuración de CMake de acuerdo con el manual de CMake

Ejemplo de línea de cambio:

TARGET_LINK_LIBRARIES(fann m)