Рассмотрим следующий вызов 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
Что тут происходит?
На самом деле я не вижу, чтобы вы связывали библиотеку с основной программой.
Я обычно не использую -L для этого (это устанавливает путь поиска, но я знаю, где находится библиотека). Просто добавьте ваш lib / libutil.a в вызов компоновщика, как если бы вы использовали другой объектный файл. Если вы хотите сохранить схему «search my lib», добавьте -lutil и надейтесь, что никакая другая библиотека утилит не помешает.
Других решений пока нет …