将GSL与-static链接时出错

时间:2017-01-30 16:38:54

标签: g++ static-linking archlinux gsl

我用c ++编写了一个程序。链接和runiing正在工作,只要我不使用g ++的“-static”选项。但我必须使用默认设置从Antergos USB-Live Stick运行它,并且不包含GSL。在GSL的手册中,他们建议

$ g++ -c main.cpp
$ g++ -static main.o -lgsl -lgslcblas -lm -lnlopt

但是对于这段代码,我收到一条错误消息:

/usr/bin/ld: cannot find -lgsl
/usr/bin/ld: cannot find -lgslcblas
collect2: Fehler: ld gab 1 als End-Status zurück

我尝试了this question,但它对我不起作用。我跑的时候

$ g++ -O2 -o test main.cpp -lgsl -lgslcblas -lnlopt -lm
$ lld test

打印

linux-vdso.so.1 (0x00007fffa5b95000)
libgsl.so.19 => /usr/lib/libgsl.so.19 (0x00007f8748c9a000)
libgslcblas.so.0 => /usr/lib/libgslcblas.so.0 (0x00007f8748a5d000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f87486d5000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f87483d1000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f87481ba000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f8747e1c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f87490fe000)

所以我尝试创建一个符号链接,但我也有“libgsl.so”

$ ls /usr/lib/libgsl
libgslcblas.so        libgslcblas.so.0.0.0  libgsl.so.19          
libgslcblas.so.0      libgsl.so             libgsl.so.19.3.0  

我做了些蠢事吗?感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

传递-lgsl时,默认情况下请求链接器 查找并链接共享库libgsl.so或静态 库libgsl.a并且如果找到两者,则更喜欢共享库 在同一个搜索目录中。链接器将首先搜索任何内容 您使用-L/path/to/search选项指定的目录, 按您指定的顺序,然后在其默认搜索目录中 (/usr/lib等)。同样适用于-lgslcblas

但是当您将链接选项-static传递给gcc/g++时,它会阻止 链接任何共享库。共享库libgsl.solibgslcblas.so 将被忽略。静态库libgsl.alibgslblas.a必须是 在某些或其他搜索目录中找到链接 成功。

链接器说:

/usr/bin/ld: cannot find -lgsl
/usr/bin/ld: cannot find -lgslcblas

因为它无法找到那些静态库 - 大概是因为你 没有安装它们。

你没有说你正在做什么Linux发行版,但是如果包 提供libgsllibgslcblas的内容称为libgsl[suffix] 然后会有一个名为libgsl-devlibgsl-devel的相应包, 或类似的。这将是包的开发版本, 供想要开发与libgsl链接的软件的人使用 或libgslcblas。开发包将需要libgsl包作为依赖项 - 所以它将安装相同的东西 - 并将另外包含 库的头文件和库的静态版本

因此,您需要为发行版安装libgsl开发包。 例如,对于Ubuntu,libgsl-dev

<强>后来

我认为您的发行版Arch Linux不会单独执行开发包。您 需要从源构建静态库。要做到这一点,你需要 至少已安装:

GNU Make
GNU autotools (autoconf, automake, libtool)
GCC (C compiler)
texinfo

然后进行默认构建:

  • https://savannah.gnu.org/git/?group=gsl获取gsl源包 通过克隆git repo或下载当前的tar.gz tarball 并提取它。

  • cd进入包目录。

  • 运行./autogen.sh。如果GNU autotools先决条件,这将成功 已经实现了。

  • 运行./configure --enable-maintainer-mode(因为./autogen.sh会提示你)。 如果满足包依赖性,这将成功 和环境健全检查通过。

  • 运行make

  • 如果make完成且没有错误 - 这将花费几分钟 - 然后,作为root ,运行make install

如果一切顺利,这将安装缺少的静态库:

/usr/local/lib/libgsl.a
/usr/local/lib/libgslcblas.a

您不需要修改链接命令以供链接器查找 它们:/usr/local/lib是默认的链接器搜索路径。