2017-10-04 32 views
1

我正在运行一个代码(iHARM2D),它需要群集上的GNU scientific library library(GSL)。由于GSL库没有安装在集群上,我必须在那里编译它,并在编译实际代码时正确链接它。在我的shell脚本我写链接到群集上的GNU科学库?

cd whereGSLsource 
./configure --prefix=/homefolder/iHARM/GSLcompiled 
make && make install 

这编译GSL并将结果放置在/ homefolder/iHARM/GSLcompiled/lib目录,/ homefolder/iHARM/GSLcompiled /包括等

this answer,我应该能够通过我的主要代码

export CPATH="/homefolder/iHARM/GSLcompiled/include":$CPATH 
export LIBRARY_PATH="/homefolder/iHARM/GSLcompiled/lib":$LIBRARY_PATH 

但是在编译之前写以下行到我的shell脚本来编译,这似乎并没有因为编译返回类型“未定义参考`的错误正确链接GSL gsl_some_fun ction'”。 (当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

您的'--prefix'设置可能太具体。请参阅https://stackoverflow.com/a/16363784/841108 –

回答

1

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

顺便说一句,你可以(也可能应该)在你的笔记本电脑上安装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包提供了它们(所以我不需要重建它)。

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

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

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

您不需要或不想弄脏带有静态链接的$LD_LIBRARY_PATH-Wl,-rpath。当你想要动态链接时,请阅读rpath

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

+0

解决方案确实是以gcc的方式将参数写入您声明的方式! (另外,是的,按照正确的顺序。) – Void