我试图静态链接glibc以便在较旧的操作系统上运行我的应用程序,但是当我使用-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时,链接这些库的正确方法是什么?
根据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
,如果我错了,请纠正我。