10

我正在为一个班级评分 C 和 C++ 文件,这个作业使用 GSL 库。由于我的计算机没有 root 权限,我的 GSL 库安装在我的主目录中,因此我需要告诉编译器和链接器在哪里可以找到它。

当我自己编写程序时,这不是问题,因为我只是在 gcc 中添加了适当的 -L 和 -I 标志。

但是当我编译学生的文件时,我不想编辑他们的每一个makefile。相反,我想将适当的目录放入环境变量中,以便它无缝地发生。

为此,我使用库或包含位置导出了以下变量:C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、LIBRARY_PATH 和 LD_LIBRARY_PATH

但是当我编译一个学生的项目时,

gcc -Wall -o MC_thread MC_thread.c -lgsl -lgslcblas -lpthread -lm

我收到以下错误:

/usr/bin/ld: cannot find -lgsl
collect2: ld returned 1 exit status
make: *** [all] Error 1

我正在使用 gcc v 4.1.2。如果我使用 gcc v 4.4,我实际上没有收到错误,但我不知道为什么。我的链接器是:

ld -V
GNU ld version 2.17.50.0.6-12.el5 20061020.
4

4 回答 4

12

您可以尝试使用环境变量 LIBRARY_PATH

来自man gcc(至少 4.4 版)

       图书馆路径
           LIBRARY_PATH 的值是以冒号分隔的目录列表,
           很像PATH。当配置为本机编译器时,GCC 会尝试
           搜索特殊链接器时指定的目录
           文件,如果使用 GCC_EXEC_PREFIX 找不到它们。使用链接
           GCC 在搜索普通的时候也会用到这些目录
           -l 选项的库(但使用 -L 指定的目录来
           第一的)。

然后在运行他们的程序时使用 LD_LIBRARY_PATH 让运行时链接器找到库。

于 2010-02-09T14:35:14.293 回答
3

上面的很多答案都建议使用 LD_LIBRARY_PATH。但这是不正确的,因为这是动态(运行时)链接器的环境变量,而不是编译时链接器 ld。

正确的做法是要求学生附加如下内容:

-L$(EXTRA_LINK_DIRECTORY)

在他们定义构建规则的地方的 Makefile 中。然后,当编译时,请执行以下操作:

导出 EXTRA_LINK_DIRECORY=/home/...

于 2010-02-20T00:06:49.637 回答
1

如果您使用的是 64 位机器,那可能就是问题所在。OMM,gcc 4.1 不搜索 LIBRARY_PATH 中指定的路径,而是搜索 path/../lib64。您需要直接指定 -L ,或者将目录符号链接到同一级别的 lib64,或者弄乱 gcc 规范。

请参阅http://gcc.gnu.org/ml/gcc-help/2010-11/msg00360.html为什么 g++ 会在 LIBRARY_PATH/../lib64 中查找,以及在哪里记录?

(OMM,这确实适用于 gcc 4.5,没有任何混乱,所以我猜他们稍后会修复它。)

于 2013-02-13T20:53:51.030 回答
0

我的建议是要求学生在他们的 makefile 中支持 CFLAGS 环境变量,否则他们会失败。:) 然后你可以导出 CFLAGS="-Lwhatever"。

或者您可以使用 LD_LIBRARY_PATH。

于 2010-02-17T18:20:46.307 回答