针对库链接但直接传递obj文件的未解析名称可以正常工作

unresolved names linking against library but passing obj files directly works fine?

本文关键字:常工作 工作 链接 文件 obj      更新时间:2023-10-16

考虑以下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 -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

这是怎么回事?

我实际上并没有看到您将库链接到主程序。

我通常不使用-L(这设置了一个搜索路径,但我知道库在哪里)。只需像添加另一个对象文件一样,在链接器调用中添加lib/libuti.a即可。如果您想保留"searchmylib"方案,请添加-lutil,并希望没有其他util库会妨碍您。