我用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
我做了些蠢事吗?感谢您的帮助。
答案 0 :(得分:3)
传递-lgsl
时,默认情况下请求链接器
查找并链接共享库libgsl.so
或静态
库libgsl.a
并且如果找到两者,则更喜欢共享库
在同一个搜索目录中。链接器将首先搜索任何内容
您使用-L/path/to/search
选项指定的目录,
按您指定的顺序,然后在其默认搜索目录中
(/usr/lib
等)。同样适用于-lgslcblas
。
但是当您将链接选项-static
传递给gcc/g++
时,它会阻止
链接任何共享库。共享库libgsl.so
,libgslcblas.so
将被忽略。静态库libgsl.a
,libgslblas.a
必须是
在某些或其他搜索目录中找到链接
成功。
链接器说:
/usr/bin/ld: cannot find -lgsl
/usr/bin/ld: cannot find -lgslcblas
因为它无法找到那些静态库 - 大概是因为你 没有安装它们。
你没有说你正在做什么Linux发行版,但是如果包
提供libgsl
和libgslcblas
的内容称为libgsl[suffix]
然后会有一个名为libgsl-dev
,libgsl-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
是默认的链接器搜索路径。