Существует ли стандартный порядок связывания нескольких библиотек в командной строке GCC - PullRequest
0 голосов
/ 08 ноября 2019

Я пытался связать объектный файл "blas.o", скомпилированный из пользовательского файла C, с некоторыми сторонними библиотеками.

Это работает следующим образом,

$ gcc blas.o -lgsl -lgslcblas   -lm 

но не таким образом

$ gcc -lgsl -lgslcblas   -lm blas.o
blas.o: In function `main':
blas.c:(.text+0xf9): undefined reference to `gsl_matrix_view_array'
blas.c:(.text+0x116): undefined reference to `gsl_matrix_view_array'
blas.c:(.text+0x136): undefined reference to `gsl_matrix_view_array'
blas.c:(.text+0x16f): undefined reference to `gsl_blas_dgemm'
collect2: error: ld returned 1 exit status

Выше, blas.o зависит от связанных библиотек, но не наоборот. Могу ли я заключить, что компоновщик на самом деле берет символы справа налево из командной строки? Мои версии gcc и ld перечислены ниже:

$gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright info...

$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.26.1
Copyright info...

Я понимаю, что порядок связанных библиотек и объектов может иметь значение для некоторых компоновщиков. Но, в общем, существует ли безопасный (или называемый универсальный) порядок для связи библиотек в командной строке GCC? Например, существует ли какой-то стандарт, которому соответствуют все линкеры?

1 Ответ

0 голосов
/ 08 ноября 2019

Но, в общем, существует ли безопасный (или называемый универсальный) порядок связывания библиотек в командной строке GCC?

Да: перечислить их в правильно order.

Например, существует ли какой-то стандарт, которому соответствуют все линкеры?

Да: правильный порядок.

Чтобы понять правильный порядок, прочитайте this .

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