【问题标题】:Two ways of linking to static libraries链接到静态库的两种方式
【发布时间】:2013-02-22 07:20:56
【问题描述】:

这里有几种使用静态库中的函数的方法,这些函数用 ar 压缩(即 libSOMTEHING.a):

ld -Lpath/to/library -lname myapp.o -o 结果
ld path/to/library/libname.a myapp.o -o 结果

有什么区别?例如,整个库是链接在可执行文件中,还是只是所需的函数?在第二个示例中,切换 lib 和目标文件的位置是否重要?

【问题讨论】:

  • 1) “-Lpath/to/library”让你在“path/to/library”中找到多个库;硬编码 .a 路径不会。 2) 如果 .o 需要 .a 中的模块,那么库应该在之后出现。

标签: gcc ld unix-ar


【解决方案1】:

在第一行中,在目录中搜索动态库 (libname.so) 之前发生在静态库 (libname.a) 之前。此外,标准库路径也会搜索 libname.*,而不仅仅是 /path/to/library。

来自“人 ld”

在支持共享库的系统上,ld 也可以搜索 libnamespec.a 以外的文件。具体来说,在 ELF 和 SunOS 上 系统,ld 将在目录中搜索名为的库 libnamespec.so 在搜索一个名为 libnamespec.a 之前。 (经过 按照惯例,“.so”扩展名表示共享库。)

第二行强制链接器使用 path/to/lib 处的静态库。

如果没有构建动态库 (libname.so),并且唯一可用的库是 path/to/library/libname.a,那么这两行将生成相同的“结果”二进制文件。

【讨论】:

  • 假设没有 .so 库。那么二进制文件将是相同的,因为与另一个调用相比,在其中一个调用中不会链接额外的函数。对吗?
猜你喜欢
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多