我正在运行代码(iHARM2D),该代码需要群集上的GNU scientific library library(GSL)。由于集群上没有安装GSL库,我必须在那里编译它并在编译实际代码时正确链接它。在我的shell脚本中,我写了
cd whereGSLsource
./configure --prefix=/homefolder/iHARM/GSLcompiled
make && make install
这将编译GSL并将结果放入/ homefolder / iHARM / GSLcompiled / lib,/ homefolder / iHARM / GSLcompiled / include等。
根据this answer,我应该能够在编译主代码之前将以下行编写到我的shell脚本中进行编译
export CPATH="/homefolder/iHARM/GSLcompiled/include":$CPATH
export LIBRARY_PATH="/homefolder/iHARM/GSLcompiled/lib":$LIBRARY_PATH
但是,这似乎没有正确地链接GSL,因为编译会返回类型"未定义引用`gsl_some_function'"的错误。 (当使用默认安装和GSL链接时,它可以在我的计算机上运行。)
编译期间GSL输出或this answer建议的另一种可能性是修改LD_LIBRARY_PATH变量
LD_LIBRARY_PATH="/homefolder/iHARM/GSLcompiled/lib":$LD_LIBRARY_PATH
但是这给出了相同的结果。类似地,当我尝试使用-L和-I选项
进行链接时,它不会cd iHARM
gcc -someoptions -I../GSLcompiled/include/ -L../GSLcompiled/lib ./some.o -o harm
GSL提出的另一个选择是使用
gcc -someoptions -Wl,-rpath -Wl,"/homefolder/iHARM/GSLcompiled/lib" ./some.o -o harm
然而,这些都不起作用。
如何正确链接GSL?
(我对此不是很有经验,所以这也可能是语法中的一些非常基本的错误。)
答案 0 :(得分:2)
先运行configure --help
;你会发现它接受了你想要使用的--enable-static
选项。
BTW你可以(也可能应该)在你的笔记本电脑上安装Linux并在其上进行编译(然后scp
一个大部分静态链接的二进制文件到你的集群。)
您最好为所有自动配置的软件分享一个共同的--prefix
。见this。阅读documentation of autoconf。假设您始终使用--prefix=$HOME/soft
(不需要任何root权限)。
您可以使用make
进行编译,然后执行make install DESTDIR=/tmp/gslinst
,以便安装的内容进入/tmp/gslinst
,您可以检查,然后将其正确复制到与您的前缀相关的目录。
您会找到libgsl.a
和libgslcblas.a
。在我的Debian系统上,libgsl-dev
包提供了它们(所以我不需要重建它)。
然后你将使用这些静态库。您可以为他们提供完整的路径,即在$HOME/soft/lib/libgsl.a
的{{1}}命令链接中明确使用gcc
,例如将其链接到
harm
但是YMMV。 gcc some.o $HOME/soft/lib/libgsl.a -o harm
的参数顺序非常重要。
您不需要或想要使用静态链接来混淆gcc
或$LD_LIBRARY_PATH
。如果需要动态链接,请阅读rpath。
另见-Wl,-rpath
说明的内容。