【问题标题】:Linking library with gcc - ld: cannot find -larpack使用 gcc - ld 链接库:找不到 -larpack
【发布时间】:2017-10-19 22:56:58
【问题描述】:

我在没有 root 权限的服务器上安装软件。我在安装过程中遇到以下错误:

make[1]: *** [hgaprec] Error 1
make[1]: Leaving directory `/seq/.../SOFTWARE/hgaprec/src'
make: *** [all-recursive] Error 1
Making install in src
make[1]: Entering directory `/seq/.../SOFTWARE/hgaprec/src'
g++  -O3   -o hgaprec ratings.o main.o log.o hgaprec.o -larpack -llapack -
lblas -lgsl -lpthread -lgslcblas 
/.../software/free/Linux/redhat_6_x86_64/pkgs/gcc_5.2.0/bin/ld: cannot 
find -larpack
collect2: error: ld returned 1 exit status
make[1]: *** [hgaprec] Error 1
make[1]: Leaving directory `/seq/.../SOFTWARE/hgaprec/src'
make: *** [install-recursive] Error 1

由于找不到库arpack,于是我在/seq/.../SOFTWARE/hgaprec/ARPACK这里安装,发现进程生成了一个静态文件libarpack_LINUX.a。要将此静态库链接到 gcc,请使用以下命令:

gcc -larpack -L/seq/.../SOFTWARE/hgaprec/ARPACK/libarpack_LINUX.a

但是,在安装未找到 larpack 的软件时,我不断收到相同的错误。我是否使用了错误的链接命令?

【问题讨论】:

  • 一个不错的技巧是运行gcc -m64 -W,verbose ...,它应该告诉链接器准确地显示它正在寻找的位置
  • 不要把库的名字放在-L后面,只要是它所在的目录。我不知道这是否重要,但你应该只是把目录。例如,如果我链接到 libA.a,我会输入:gcc main.c -L/path/to/lib -lA
  • 所以你应该试试gcc main.c -L/path/to/lib -larpack_LINUX
  • 为什么/seq后面有..,你是在缩写长路径吗?如果是字面值,/seq/../SOFTWARE/hgaprec/ARPACK/ 等价于/SOFTWARE/hgaprec/ARPACK
  • 使用缩写作为路径太长

标签: c++ gcc installation arpack


【解决方案1】:

您要么想要gcc main.c /seq/../SOFTWARE/hgaprec/ARPACK/libarpack_LINUX.a(如果您指定静态库的完整路径,则不需要-l-L),或者像@Julian_Cienfuegos 建议的gcc main.c -L/seq/../SOFTWARE/hgaprec/ARPACK/ -larpack_LINUX。这假设您只编译一个名为 main.c 的文件,其中包含您的 main() 函数,并输出 a.out 二进制文件。

编辑:添加了main.c 的解释。

【讨论】:

  • 您能扩展一下 吗?这是必要的论据吗?我在 arpack 或 hgaprec 中没有看到 main.c
【解决方案2】:

在将 ARPACK 库路径作为 LD 标志的一部分包含在配置中后,我的问题得到了解决,如下所示:

./configure --prefix=/seq/.../SOFTWARE/hgaprec LDFLAGS="-L/seq/.../SOFTWARE/hgaprec/ARPACK/"

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多