【问题标题】:static library linking issue using SUSE Linux and C使用 SUSE Linux 和 C 的静态库链接问题
【发布时间】:2014-03-29 17:17:41
【问题描述】:

我尝试编译一些非常简单的 C 代码,以尝试了解静态库以及 BFD 的工作原理。

我使用这个 gcc 命令构建了代码,但它找不到 libbfd,而 libbfd.a 静态库位于 /usr/lib64 中,我也在本地复制了它,并且给这两个目录指定了 -L找到静态库,还是找不到:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bfd.h"

unsigned int number_of_sections(bfd *abfd)
{
  return bfd_count_sections(abfd);
}

int main (int argc, char *argv[])
{
  bfd *ibfd = NULL;
  unsigned int numSections = 0;

  if (argc < 2)
    {
      printf("Argc < 2\n");
      exit(EXIT_FAILURE);
    }
  else
    {
      bfd_init();
      printf("filename = %s\n", argv[1]);
      ibfd = bfd_openr(argv[1], NULL);
      numSections = number_of_sections(ibfd);
      printf("num sections = %d\n", numSections);
    }
  return 1;
}

gcc -g -Wall -llibbfd -I. -I/usr/include -L. -L/usr/lib64 -o getsections ./getsections.c
/usr/lib64/gcc/x86_64-suse-linux/4.7/../../../../x86_64-suse-linux/bin/ld: cannot find -llibbfd
collect2: error: ld returned 1 exit status
make: *** [build] Error 1

I also made sure the path was on the LD_LIBRARY_PATH Linux environment variable:
printenv LD_LIBRARY_PATH
/usr/lib64:/usr/lib64/mpi/gcc/openmpi/lib64

I changed the gcc command slightly (-lbfd instead of -llibbfd) and here was the error:

gcc -g -Wall -lbfd -I. -I/usr/include -L. -L/usr/lib64 -o getsections ./getsections.c
/tmp/ccM9GYqT.o: 
In function `main':
/home/karen/dev/cs410_spring2014/./getsections.c:253: undefined reference to `bfd_init'
/home/karen/dev/cs410_spring2014/./getsections.c:255: undefined reference to `bfd_openr'
collect2: error: ld returned 1 exit status
make: *** [build] Error 1

我搜索和搜索,但找不到最有可能是一个非常简单的问题的答案,对于我的无知,我提前道歉!

【问题讨论】:

  • 尝试将-lbfd放在命令行末尾(./getsections.c之后)。
  • I was not sure if I should make a separate question to Stack Overflow? 绝对是一个新问题

标签: c linux linker static-libraries bfd


【解决方案1】:

啊,对了。您的问题是您在使用它们的 getsections.c 之前指定了库。

链接器的工作方式它只从库中提取那些解析链接器正在查找的某些符号的目标文件,并且链接器会按照您在命令行中指定它们的顺序处理库和目标文件。在这种情况下,当链接器查看 libbfd.a 时,链接器没有需要解析的未解析符号,因此它跳过了所有对象。然后链接器必须处理使用 bfd_init 和 bfd_openr 的 getsections.c。唉,这是命令行上的最后一项,链接器仍然有这些符号未解析。

-lbfd放在你的源文件和链接应该可以工作。

【讨论】:

  • 谢谢 - 这确实有帮助,但仍然存在一个错误,我的问题是:这是共享对象库问题,而不是静态库问题?我会将其添加到上述问题中 - 还是应该将其作为单独的问题发布?
  • 请提出一个新问题。在此处接受问题的答案。
【解决方案2】:

此命令行不正确:

gcc -g -Wall -lbfd -I. ...

您需要将-lbfd 移动到链接行的end。要了解原因,请阅读this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多