0

次の g++ 呼び出し (OSX 10.6.5 で動作する Apple GCC 4.2.1) を考えてみましょう。これは問題なく動作します。

g++ -c util/warthog_cfg.cpp -o  util/obj/warthog_cfg.o -DOS_MAC -O0 -Wall -Wno-sign-compare -ansi -fmessage-length=0 -m32
g++ main.cpp -o main -I./util util/obj/warthog_cfg.o -m32

2 行目の引数として warthog_cfg.o (必要なオブジェクト ファイル) を渡したことに注意してください。ここで、warthog_cfg.o をライブラリ ファイルに入れ、それに対してリンクしたいと考えています。私は以下を実行します:

g++ -c util/warthog_cfg.cpp -o  util/obj/warthog_cfg.o -DOS_MAC -O0 -Wall -Wno-sign-compare -ansi -fmessage-length=0 -m32
ar -crs lib/libutil.a  util/obj/warthog_cfg.o
g++ main.cpp -o ./bin/main -DOS_MAC -O0 -Wall -Wno-sign-compare -ansi -fmessage-length=0 -m32 -L./lib -framework CoreServices -I./TransitC -I./cpd2012/ -I./util -lutil -lutil
Undefined symbols:
  "warthog::util::warthog_cfg::print(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
      _main in ccI5ycWY.o
  "warthog::util::warthog_cfg::warthog_cfg()", referenced from:
      _main in ccI5ycWY.o
  "warthog::util::warthog_cfg::parse_args(int, char**)", referenced from:
      _main in ccI5ycWY.o
  "warthog::util::warthog_cfg::~warthog_cfg()", referenced from:
      _main in ccI5ycWY.o
      _main in ccI5ycWY.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [main] Error 1

呼び出しは同一に見えます。おそらく問題は、アーカイブに .o ファイルを追加していないことにあると思いました。ただし、 otool はそうではないことを示しているようです。ファイルサイズもほぼ正しいようです。

otool -I lib/libutil.a 
Archive : lib/libutil.a
lib/libutil.a(warthog_cfg.o):

-rw-r--r--  1 foo  staff  5908 10 Sep 18:39 warthog_cfg.o
-rw-r--r--  1 foo  staff  6800 10 Sep 18:35 lib/libutil.a

何が起きてる?

4

1 に答える 1

0

ライブラリをメインプログラムにリンクしているのを実際には見ていません。

通常、これには -L を使用しません (これにより検索パスが設定されますが、ライブラリの場所はわかっています)。別のオブジェクト ファイルと同じように、リンカー呼び出しに lib/libutil.a を追加するだけです。「私のライブラリを検索」スキームを維持したい場合は、 -lutil を追加して、邪魔になる他の util ライブラリがないことを願っています。

于 2012-09-10T08:56:52.783 に答える