Размещение опции `-l 'в gcc - PullRequest
       16

Размещение опции `-l 'в gcc

3 голосов
/ 23 декабря 2011

У меня возникли проблемы с размещением опции -l при использовании gcc.Вот урезанная версия для воспроизведения проблемы.

tc:

#include <pthread.h>

int main() {
    pthread_create(0, 0, 0, 0);
}

и в терминале:

$ gcc -lpthread t.c  
/tmp/ccmkwV7B.o: In function `main':  
t.c:(.text+0x29): undefined reference to `pthread_create'  
collect2: ld returned 1 exit status

$ gcc t.c -lpthread  
$ (compiles ok)

Почему я должен поставить -lpthread вконец, чтобы заставить это работать?И кажется, что эта проблема возникает только на 32-битных Linux.

Информация о моем окружении прикреплена ниже:
gcc -lpthread t.c не работает на этом компьютере.

$ gcc --version  
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1  

$ uname -rm  
3.0.0-12-generic i686

gcc -lpthread t.c работает на этом компьютере.

$ uname -rm  
2.6.18-274.3.1.el5 x86_64  

$ gcc --version  
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51)  

Я посмотрел руководство по gcc, и там написано, что "размещение -l имеет значение" .Что именно это значит?

1 Ответ

5 голосов
/ 23 декабря 2011

Из руководства ,

Имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке. Таким образом, foo.o -lz bar.o ищет библиотеку z после файла foo.o, но до bar.o. Если bar.o относится к функциям в z, эти функции могут не загружаться.

Это означает, что очень интересно, что связывание библиотеки сначала работает на gcc 4.1.2. Это может быть связано с библиотеками по умолчанию, с которыми связан компилятор. Я знаю, что в некоторых случаях мне не нужно явно ссылаться на pthreads.

Что касается дальнейшего размышления, я думаю, что проблема связана с флагом --as-needed, который может быть включен по умолчанию в вашей системе gcc 4.6. Смотрите эту ссылку для некоторого обсуждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...