将 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.so
,libgslcblas.so
将被忽略。静态库 libgsl.a
、libgslblas.a
,必须是
在某些或其他搜索目录中找到 linkage 到
成功。
link 人说:
/usr/bin/ld: cannot find -lgsl
/usr/bin/ld: cannot find -lgslcblas
因为它找不到那些静态库——大概是因为你
还没有安装它们。
你没有说你正在开发什么 linux 发行版,但是如果包
提供 libgsl
和 libgslcblas
的函数被称为 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 搜索路径。
我用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.so
,libgslcblas.so
将被忽略。静态库 libgsl.a
、libgslblas.a
,必须是
在某些或其他搜索目录中找到 linkage 到
成功。
link 人说:
/usr/bin/ld: cannot find -lgsl
/usr/bin/ld: cannot find -lgslcblas
因为它找不到那些静态库——大概是因为你 还没有安装它们。
你没有说你正在开发什么 linux 发行版,但是如果包
提供 libgsl
和 libgslcblas
的函数被称为 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 搜索路径。