链接到集群上的 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.a
和 libgslcblas.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
讲述的内容。
我是运行一个集群上的代码(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.a
和 libgslcblas.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
讲述的内容。