неразрешенные имена, связанные с библиотекой, но передача файлов obj напрямую работает нормально?

Рассмотрим следующий вызов 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

Что тут происходит?

0

Решение

На самом деле я не вижу, чтобы вы связывали библиотеку с основной программой.

Я обычно не использую -L для этого (это устанавливает путь поиска, но я знаю, где находится библиотека). Просто добавьте ваш lib / libutil.a в вызов компоновщика, как если бы вы использовали другой объектный файл. Если вы хотите сохранить схему «search my lib», добавьте -lutil и надейтесь, что никакая другая библиотека утилит не помешает.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]