使用-static进行编译会导致未定义对其他库中函数的引用

时间:2019-04-25 23:06:05

标签: c++ linux static-libraries linker-errors

我试图静态链接glibc以便在较旧的OS上运行我的应用程序,但是当我使用-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函数的未定义引用。但是,如果我从makefile中删除了-static,那么一切都会正常进行。当我使用-static时,链接这些库的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

根据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.

*.o之后移动-lxerces可能会解决您的问题。

我认为除了最后一行,您不需要添加-static,如果我错了,请纠正我。