【发布时间】:2019-04-25 23:06:05
【问题描述】:
我正在尝试静态链接 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 函数的引用。但是,如果我从 makefile 中删除 -static,一切都会正常运行。当我使用 -static 时,链接这些库的正确方法是什么?
【问题讨论】:
-
恕我直言,但您是否确认除了共享对象库之外还安装了静态库?如果我没记错的话,有许多包只安装共享对象库,除非库归档包也被显式安装。你用的是什么发行版?例如在 SuSE 上,只安装了 libgsl 的共享对象版本。
-
各自的lib目录都包含.a和.so文件,所以我相信没关系。使用 CentOS 7。
-
请提供准确的错误信息。只是“未定义的参考”一词可能意味着发生的原因太多了。
标签: c++ linux static-libraries linker-errors