将 GSL 与 -static 链接时出错

Error when linking GSL with -static

我用c++写了一个程序。只要我不对 g++ 使用“-static”选项,链接和 运行iing 就可以正常工作。但我必须从具有默认设置的 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  

我是不是在做傻事?感谢您的帮助。

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

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

link 人说:

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

因为它找不到那些静态库——大概是因为你 还没有安装它们。

你没有说你正在开发什么 linux 发行版,但是如果包 提供 libgsllibgslcblas 的函数被称为 libgsl[suffix] 然后会有一个对应的包叫libgsl-dev,libgsl-devel, 或类似的。这将是软件包的 development 版本, 供想要开发 link 具有 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

您不需要修改 linkage 命令,linker 就可以找到 他们:/usr/local/lib 是默认的 linker 搜索路径。