4

我有许多源文件要合并到一个.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文件做些什么才能链接到它吗?

4

2 回答 2

4

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

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

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

nm libcathat.a
于 2012-06-19T02:32:40.073 回答
3

通常,您不需要在大多数现代版本的 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.

于 2012-06-19T03:32:07.750 回答