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

问题描述 投票:0回答:1

我试图静态链接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时,链接这些库的正确方法是什么?

c++ linux static-libraries linker-errors
1个回答
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,如果我错了,请纠正我。

© www.soinside.com 2019 - 2024. All rights reserved.