Компиляция с -static вызывает неопределенные ссылки на функции в других библиотеках - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь статически связать glibc для запуска моего приложения на более старой ОС, но когда я использую флаг -static, я получаю ошибки «неопределенная ссылка» для других библиотек, которые я использую, но не получаю без использования -static. Как мне исправить эту проблему?

Мой Makefile производит следующие команды:

g++ -static -Wall -O3 -w -std=c++11 -I/storage/home/PA/libs -I/storage/home/PA/libs/xerces -fopenmp -c  Utilities.cpp
gcc -static -Wall -O3 -w -std=c++11 -I/storage/home/PA/libs -I/storage/home/PA/libs/xerces -fopenmp -c  ccvt.c
gcc -static -Wall -O3 -w -std=c++11 -I/storage/home/PA/libs -I/storage/home/PA/libs/xerces -fopenmp -c  client.c
g++ -static -Wall -O3 -w -std=c++11 -I/storage/home/PA/libs -I/storage/home/PA/libs/xerces -fopenmp -c  XML_Params.cpp
g++ -static -Wall -O3 -w -std=c++11 -I/storage/home/PA/libs -I/storage/home/PA/libs/xerces -fopenmp -c  main.cpp
g++ -static -Wall -O3 -std=c++11 -L/storage/home/PA/libs/gsl -fopenmp -lgsl -lgslcblas -lm -L/storage/home/PA/libs/xerces -lxerces-c  -o App main.o Utilities.o XML_Params.o ccvt.o client.o 

После последней строки я получаю огромную стену ошибок с жалобами на неопределенные ссылки на функции Xerces и gsl. Однако, если я удалю -static из make-файла, все будет нормально. Как правильно связать эти библиотеки, когда я использую -static?

1 Ответ

0 голосов
/ 26 апреля 2019

в соответствии с руководством gcc:

 -llibrary
           It makes a difference where in the command you write this option; the
           linker searches and processes libraries and object files in the order
           they are specified.  Thus, foo.o -lz bar.o searches library z after
           file foo.o but before bar.o.  If bar.o refers to functions in z,
           those functions may not be loaded.

Перемещение -lxerces после *.o может решить вашу проблему.

Я думаю, вам не нужно добавлять -static за исключениемпоследняя строка, поправьте меня, если я ошибаюсь.

...