我正在为一个类评分C和C ++文件,这个作业使用GSL库。由于我的计算机上没有root权限,因此我的GSL库安装在我的主目录中,因此我需要告诉编译器和链接器在哪里找到它。
当我自己编写程序时,这不是问题,因为我只是将相应的-L和-I标志添加到gcc。
但是当我编译学生的文件时,我不想编辑他们的每个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.
答案 0 :(得分:11)
您可以尝试使用环境变量LIBRARY_PATH
来自man gcc(至少版本4.4)
LIBRARY_PATH The value of LIBRARY_PATH is a colon-separated list of directories, much like PATH. When configured as a native compiler, GCC tries the directories thus specified when searching for special linker files, if it can't find them using GCC_EXEC_PREFIX. Linking using GCC also uses these directories when searching for ordinary libraries for the -l option (but directories specified with -L come first).
然后在运行程序时使用LD_LIBRARY_PATH,让运行时链接程序找到库。
答案 1 :(得分:3)
上面的很多答案都建议使用LD_LIBRARY_PATH。但这是不正确的,因为这是动态(运行时)链接器的环境变量,而不是编译时链接器ld。
这样做的正确方法是要求学生附加以下内容:
-L$(EXTRA_LINK_DIRECTORY)
在他们的Makefile中定义构建规则的位置。然后,当你编译时,执行以下操作:
导出EXTRA_LINK_DIRECORY = / home /...
答案 2 :(得分:1)
如果您使用的是64位计算机,那可能就是问题所在。 OMM,gcc 4.1不搜索LIBRARY_PATH中指定的路径,而是搜索路径/../ lib64。您需要直接指定-L,或者将目录符号链接到同一级别的lib64,或者使用gcc规范。
请参阅http://gcc.gnu.org/ml/gcc-help/2010-11/msg00360.html和Why does g++ look in LIBRARY_PATH/../lib64 and where is this documented?
(OMM,这确实适用于gcc 4.5而没有任何混乱,所以我猜他们稍后会修复它。)
答案 3 :(得分:0)
我的建议是要求学生在其makefile中支持CFLAGS环境变量,否则它们会失败。 :)然后你可以导出CFLAGS =“ - Lwhatever”。
或者您可以使用LD_LIBRARY_PATH。