4

1 つのファイルにまとめたいソース ファイルが多数あり.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 では他に何もする必要はありません。

ranlib一部の、主に古いバージョンの Unix では、リンカーがシンボルをすばやく検索できるようにするルックアップ テーブルを追加するために、ライブラリでを使用する必要がありました。のほとんどすべての最新バージョンはar、これを自動的に行います。必要ranlib性は、第 7 版 UNIX™ の「悪い昔」の名残のようなものです。


今は見つけられない何らかの理由で、Mac OS X 10.7.4ranlibでもアーカイブを構築していました。そうするのには理由があったに違いないが、その理由は今では無関係のようだ - アーカイブライブラリはranlib、少なくとも単一のアーキテクチャでは、Mac OS X 10.7.4 がなくても問題なく動作するようだ。2004 年 7 月に行った変更がプログラムにranlib反映されているのを見つけましたmakeが、チェックイン ノートにはなぜ変更を行ったのかが記載されていません。ルール定義ファイルを更新したので、ranlib.

于 2012-06-19T03:32:07.750 に答える