2012-06-19 11 views
3

У меня есть несколько исходных файлов, которые я хочу скопировать в файл .a. Я делаю библиотеку с помощью командыПри создании библиотеки на unix требуется что-либо, кроме «ar rcs»?

ar rcs libcathat.a thing1.o thing2.o fish.o 

Я затем попытаться сделать ссылку на эту библиотеку с тем же компилятором я использовал, чтобы сделать .o файлы (г ++):

g++ -L/path/to/cathat -lcathat seuss.o -o seuss 

Но это приводит к ошибкам, когда я попытаться использовать функции, определенные в thing1.cpp (и в теории, представленной в thing.o) вида:

/path/seuss.cpp:46: undefined reference to `redFishBlueFish(int, char**)' 

есть ли что-то еще мне нужно d o к файлу .a, чтобы сделать возможным ссылку на него?

+2

Вам не хватает красной рыбы и синей рыбы! –

+1

@ Джонатан Леффлер: Добавлена ​​ссылка на рыбу :) – Dan

ответ

4

Попробуйте переставить операторы компоновщика до конца:

g++ seuss.o -o seuss -L/path/to/cathat -lcathat 

Если это не работает, убедитесь, что эти символы являются на самом деле в архиве:

nm libcathat.a 
3

Обычно вы не» t нужно сделать что-нибудь еще в большинстве современных версий Unix.

В некоторых, в основном более старых версиях Unix, необходимо было использовать ranlib в библиотеке, чтобы добавить таблицу поиска, которая позволила компоновщику быстро находить символы. Почти все современные версии ar делают это автоматически. Необходимость ranlib - это похмелье из «плохих старых дней» 7-го издания UNIX ™.


По какой-то причине, которую я не могу теперь найти, я строила архивы на Mac OS X 10.7.4 с ranlib тоже. У меня, должно быть, была причина для этого, но эта причина кажется несущественной. — архивные библиотеки выглядят нормально, без ranlib на Mac OS X 10.7.4, по крайней мере, для единой архитектуры. Я нашел изменения, которые я сделал в июле 2004 года, которые положили ranlib обратно в программу make, но заметки регистрации не говорят, почему я внес изменения. Я обновил файл определения правил, чтобы он больше не использовал ranlib.