我有许多源文件想要聚合到一个.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
.