【问题标题】:When making a library on unix, is anything but "ar rcs" necessary?在 unix 上创建库时,除了“ar rcs”之外还有什么必要的吗?
【发布时间】:2012-06-19 02:25:05
【问题描述】:

我有许多源文件,我想将它们合并到一个.a 文件中。我用命令制作库

ar rcs libcathat.a thing1.o thing2.o fish.o

然后,我尝试使用用于制作 .o 文件 (g++) 的相同编译器链接到该库:

 g++ -L/path/to/cathat -lcathat seuss.o -o seuss

但是当我尝试使用在 thing1.cpp(理论上在 thing.o 中表示)中定义的函数时,这会产生错误:

/path/seuss.cpp:46: undefined reference to `redFishBlueFish(int, char**)'

我还需要对.a 文件执行其他操作才能链接到它吗?

【问题讨论】:

  • 你错过了红鱼和蓝鱼!
  • @Jonathan Leffler:添加了鱼参考 :)

标签: linker unix-ar


【解决方案1】:

尝试将链接器语句移到末尾:

g++ seuss.o -o seuss -L/path/to/cathat -lcathat

如果这不起作用,请确保这些符号确实在存档中:

nm libcathat.a

【讨论】:

    【解决方案2】:

    通常,您不需要在大多数现代版本的 Unix 上执行任何其他操作。

    在某些(主要是较旧的)Unix 版本上,有必要在库上使用ranlib 来添加一个查找表,使链接器能够快速查找符号。几乎所有现代版本的ar 都会自动执行此操作。需要 ranlib 就像是从第 7 版 UNIX™ 的“糟糕的过去”中遗留下来的。


    由于某种我现在找不到的原因,我也在 Mac OS X 10.7.4 上使用ranlib 构建档案。我这样做肯定是有原因的,但这个原因现在似乎无关紧要了——存档库在 Mac OS X 10.7.4 上没有ranlib 似乎可以正常工作,至少对于单一架构来说是这样。我确实发现了我在 2004 年 7 月所做的更改,将 ranlib 重新放入了 make 程序,但签入说明并没有说明我进行更改的原因。我更新了规则定义文件,使其不再使用ranlib

    【讨论】:

      猜你喜欢
      • 2015-03-15
      • 1970-01-01
      • 2023-03-22
      • 2017-04-20
      • 1970-01-01
      • 2018-12-03
      • 2011-06-02
      • 2021-03-17
      相关资源
      最近更新 更多