考虑以下 g++ 调用(Apple GCC 4.2.1,在 OSX 10.6.5 上运行),它工作得很好:
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
请注意,我在第二行中传递了 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
这些调用看起来相同。我想也许问题在于 ar 没有将 .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
这里发生了什么?