c problemas del enlazador matemático en Ubuntu 11.10 [duplicate]

4 minutos de lectura

avatar de usuario
Hachi

Apareció un error extraño después de actualizar mi Ubuntu desde (10.11, 11.04 i dont know) a 11.10.

estoy recibiendo un undefined reference to 'sqrt' mientras usa matemáticas.h y enlazar con -lm

estoy compilando con gcc -Wall -Werror -g -Iinclude/ -lm lib/matrix.c src/analyse.c -o bin/analyse.o ambos archivos fuente usan e incluyen math.h.

Este código se compiló sin problemas y no cambié mucho desde la actualización, pero ahora no funcionará.

¿Tiene alguna sugerencia de lo que puedo hacer para encontrar el error?

Lo siento, si esta pregunta se hizo antes; hay tantas publicaciones sobre errores del enlazador matemático y no encontré ninguna que coincida

  • Tengo el mismo problema en Ubuntu 11.10. No tuve ningún problema antes de actualizar. En mi caso el problema viene por seguir el comando, ¿Tienes algún comentario para mí? gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o -lm -L. -g -DASSERTS -I../src// -I../ -I../src//src -DDEBUG -lmems_internals

    – ARH

    8 de noviembre de 2011 a las 23:24

avatar de usuario
usuario786653

La biblioteca que está utilizando debe colocarse después de los archivos que la utilizan cuando la utiliza desde la línea de comandos. Así que lugar -lm en después de sus archivos C en la línea de comando.

Referencia

  • Esto no es exacto. Normalmente, el orden no importa cuando se comparte la biblioteca. El problema solo aparece cuando se especifica –as-needed o se establece como predeterminado.

    – Vladímir Prus

    16 de noviembre de 2011 a las 7:59

  • @VladimirPrus: Ambos tienen razón :-). Las versiones recientes de Ubuntu (desde 11.04/Natty Narwhal) configuran –según sea necesario como predeterminado. Ver wiki.ubuntu.com/NattyNarwhal/ToolchainTransition

    – sleske

    17 mayo 2012 a las 13:48

  • @sleske erg… ¿eso es un error ahora? un buen número de toolchans siempre colocan la lista de archivos al final del comando (Qt, por ejemplo) por diseño. Eso también crea aún más problemas con automake\cmake

    – Swift – Pastel de viernes

    6 de mayo de 2017 a las 6:31

avatar de usuario
quido.speedy

RESUELTOesta no es la falta común -lm ¡problema! ¡Estoy en la misma situación después de actualizar a (k) ubuntu 11.10!

$ whereis math.h
math: /usr/include/math.h

Makefile:
CC=gcc
CFLAGS=--std=c99 -g -pedantic -Wall -lm

uname:
Linux idefix 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

Realmente TIENES QUE colocar el -lm cambiar después -o foo foo.c parámetro

Output:
pidi@idefix:~/projekt1$ make
gcc -o b1 b1.c --std=c99 -g -pedantic -Wall -lm
pidi@idefix:~/projekt1$

¡Así que cambia tus banderas en Makefile! TIPO. ¡Este es un ERROR bastante nuevo (y grave)!

Este es un problema debido a la activación predeterminada de la bandera gcc --as-needed en el enlazador

Más información aquí: http://www.gentoo.org/proj/en/qa/según sea necesario.xml

Solución simple (funcionó para mí al menos):

Agregar -Wl,--no-as-needed al enlazador

  • El pequeño inconveniente de este enfoque es que la biblioteca matemática siempre se incluye, incluso si no se utiliza la biblioteca matemática. Así que no lo use si siempre incluye muchas bibliotecas independientemente de si se usan o no.

    – Roalto

    7 de diciembre de 2012 a las 8:49

  • Sin embargo, el enlazador no puede encontrar referencias cuando los archivos se dan en el orden incorrecto, incluso cuando se enlaza con bibliotecas estáticas. Presumiblemente, ld --no-as-neededetiquetando todas las bibliotecas compartidas de todos modos, vamos ld.so resolver las referencias.

    – cerveza

    21 oct 2021 a las 10:58

Encontré el mismo problema después de actualizar mi Ubuntu a la versión 11.10. Uso Netbeans para desarrollar y resolver el problema especificando la biblioteca estándar “Matemáticas” de la siguiente manera:

Haga clic con el botón derecho en el proyecto, haga clic en Propiedades, seleccione “Enlazador” en el menú, haga clic en “Bibliotecas” y luego en “Agregar biblioteca estándar” seleccionando “Matemáticas”.

Al compilar, la opción ‘-lm’ se coloca después de todas las demás opciones y funciona. Probablemente esta versión de gcc sigue una arquitectura específica y espera las bibliotecas al final de la línea de compilación de comandos.

¡Salud!

D.

avatar de usuario
usuario2485132

cc filename.c -lm

solo inténtalo……….☻

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad