Я пытался связать объектный файл "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? Например, существует ли какой-то стандарт, которому соответствуют все линкеры?