在 unix 上制作库时,除了"ar rcs"之外,还有什么必要吗?



我有许多源文件想要聚合到一个.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文件执行其他操作才能链接到它吗?

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

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

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

nm libcathat.a

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

在某些(主要是较旧的)Unix版本上,有必要在库上使用ranlib来添加查找表,使链接器能够快速查找符号。 几乎所有现代版本的ar都会自动执行此操作。 需要ranlib是第 7 版 UNIX™ "糟糕的旧时光"的宿醉。


由于我现在无法找到的某种原因,我也在Mac OS X 10.7.4上构建了ranlib档案。 我这样做一定是有原因的,但这个原因现在似乎无关紧要——存档库似乎可以在没有ranlib的情况下在 Mac OS X 10.7.4 上运行,至少对于单个架构而言。 我确实发现了我在 2004 年 7 月所做的更改,该更改将ranlib放回make程序中,但签入说明没有说明我进行更改的原因。 我已经更新了规则定义文件,因此它不再使用 ranlib .

相关内容

  • 没有找到相关文章

最新更新