链接到集群上的 GNU 科学图书馆?

Linking to GNU scientific library on cluster?

我是运行一个集群上的代码(iHARM2D) which requires the GNU scientific library library(GSL),由于集群上没有安装GSL库,所以我只好在那里编译好link 它在实际代码的编译过程中。在我的 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

但是,这似乎无法 link GSL 正常,因为编译 returns 类型 "undefined reference to `gsl_some_function'" 的错误。 (当默认安装和使用 GSL 的 linking 时,它在我的电脑上工作。)

编译或this answer期间GSL输出建议的另一种可能性是修改LD_LIBRARY_PATH变量

LD_LIBRARY_PATH="/homefolder/iHARM/GSLcompiled/lib":$LD_LIBRARY_PATH

但这给出了相同的结果。同样,当我尝试 link 使用 -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

然而,这些都不起作用。

那我怎么link GSL 正确呢?

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

运行先configure --help;你会发现它接受你想要使用的 --enable-static 选项。

顺便说一句,您可以(并且可能应该)在您的笔记本电脑上安装 Linux 并在其上编译(然后 scp 一个大部分静态 linked 二进制文件到您的集群)。

您最好为所有自动配置软件共享一个通用 --prefix。参见 this. Read the documentation of autoconf。假设您总是使用 --prefix=$HOME/soft(不需要任何 root 权限)。

您可以使用 make 进行编译,然后执行 make install DESTDIR=/tmp/gslinst 以便将已安装的内容放入 /tmp/gslinst 中,您将对其进行检查,然后将其适当地复制到与您的前缀相关的目录中。

您会发现 libgsl.alibgslcblas.a。在我的 Debian 系统上,libgsl-dev 软件包提供了它们(所以我不需要重建它)。

然后您将使用这些静态库。您可以为它们提供完整路径,即在您的 linking gcc 命令中明确使用 $HOME/soft/lib/libgsl.a harm,例如link 它与

 gcc some.o $HOME/soft/lib/libgsl.a -o harm

但是 YMMV。 gcc 的参数顺序很重要。

您不需要也不想用静态 linking 来扰乱 $LD_LIBRARY_PATH-Wl,-rpath。当您想要动态 linking 时,请阅读有关 rpath 的内容。

另请参阅 pkg-config 讲述的内容。