C-неопределенная ссылка на" sqrt "даже с ' - lm'

Я пытаюсь скомпилировать библиотеку на C, которая нуждается в " математике.h", вот начало .файл c:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h> 
#include "sparse_matrix.h"
...

и я компилирую с этой командой:

gcc -c ./sparse_matrix.c -o sparse_matrix.o -lm -Wall -pedantic -std=c99 -g -O

но даже с #include сделать и флаг -lm после файла (я пробовал в конце строки, но ничего не изменилось) я все еще получаю ошибку: undefined reference to « sqrt » collect2: error: ld returned 1 exit status

Я не понимаю этого после часа поиска в гугле. Я работаю с gcc 4.9 под ubuntu 14.10 (утопический единорог). Спасибо за любую помощь заранее!

1 ответов


я так не думаю is команда, которую вы выполняете (ну, это может быть один из них, но это, конечно, не вызывает ошибки).

на до gcc говорит ему только создавать объектные файлы (и вы специально отправляете вывод в sparse_matrix.o, объектный файл, а не исполняемый файл).

в этом случае компоновщик должен не будет вызван.

в самом деле, с манекен sparse_matrix.c of:

#include <math.h>
int main(void) {
    return (int)(sqrt(16.0));
}

ваша команда работает нормально и, когда я завершу процесс с:

pax> gcc -o sparse_matrix sparse_matrix.o -lm
pax> ./sparse_matrix
pax> echo $?
4

вы можете видеть, что он также работает просто отлично.

возможно, вы оставляете флаги компоновщика (например,-lm) от фактического ссылке этап, который вызовет эту проблему. Они не должны влиять на стадию компиляции (если они не влияют на обе компиляции и ссылка стадиях, но -l не те.)

и, "прекращая", я также включаю возможность "неправильного размещения". Некоторые линкеры позиционные в том, как они обрабатывают библиотеки, что они будут извлекать объекты из библиотек, только если они удовлетворяют неопределенному символу в точке, где они перечислены.

Итак, команды:

linker sparse_matrix.o -lm ...

будет работать, потому что .o файл вводит неудовлетворенную ссылку на sqrt, которым удовлетворено libm. Если ваш линкер is позиционные, тогда:

linker -lm sparse_matrix.o ...

не будет работать, потому что, во время обработки libm, там были нет неудовлетворенные символы, поэтому ничего не было извлечено. Неопределенная ссылка на sqrt затем после эта точка и нет других объектов или библиотек, чтобы удовлетворить ее.

ли ld или gcc этап компоновщика имеет это ограничение, я не знаю, я просто есть возможность как-то следить за.