链接到群集上的GNU科学库?

时间:2017-10-04 16:50:07

标签: c++ linker-errors static-linking gsl

我正在运行代码(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?

(我对此不是很有经验,所以这也可能是语法中的一些非常基本的错误。)

1 个答案:

答案 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.alibgslcblas.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说明的内容。