2015-03-03 4 views
2

У меня есть общая библиотека объектов (расширение для python на C++), которая включает в себя несколько других архивов из общей базы кода, которые были обернуты в -Wl,whole-archive arhive1.a archive2.a ... -Wl,no-whole-archive в нашей прежней домашней версии makefile s. Каждый архив содержался в его собственном подкаталоге и был построен как часть конечной цели этого расширения python. Я переношу нашу среду сборки на использование autoconf и automake.указать включение всего архива во время ссылки на общий объект

В Makefile.am, имеющих отношение к расширению питона, у меня есть это (с постороннее вещество срезаны):

pyexc_LTLIBRARIES = pyextension.la 
ARCHIVE1_PATH = ../Path/to/.libs/ # built from another Makefile.am 
ARCHIVE2_PATH = ../Path2/to/.libs/ 

pyextension_la_SOURCES = ... 

pyextension_la_LDFLAGS = -lz -lrt -module ... 
pyextension_la_LIBADD = $(ARCHIVE1_PATH)/archive1.a $(ARCHIVE2_PATH)/archive2.a 
pyextension_la_CXXFLAGS = -std=c++0x -fPIC 

Все эти вещи выходит из командной строки, но это не правильно упаковано, потому что, когда я импортируйте мой модуль pyextension, я получаю неопределенные ошибки символов из архивов, которые он ищет. Изначально у меня было что-то подобное для pyextension_LDFLAGS:

pyextension_la_LDFLAGS = -Wl,whole-archive $(ARCHIVE1_PATH)/archive1.a $(ARCHIVE2_PATH)/archive2.a -Wl,no-whole-archive -lz -lrt -module 

Однако, к моему удивлению, когда окончательный Makefile обрабатывается по маркам, после запуска ./configure опции -Wl,whole-archive и -Wl,no-whole-archive появится в командной строке, но ничего между ними (??) и архивными файлами, перечисленными в другом месте. Итак, я думал, что должен попробовать маршрут pyextension_la_LIBADD с архивами, и магия будет работать.

Я не уверен, куда идти отсюда. Кстати, эти другие архивные библиотеки будут установлены вместе с остальными как часть нашего развертывания, но во время сборки они, очевидно, еще не установлены. Таким образом, любые указатели на то, как это сделать, очень ценятся. Я все еще automake и autoconf neophyte.

+0

Нельзя размещать _any_ библиотеки или параметры, которые управляют тем, как определенные библиотеки связаны в 'LDFLAGS': не' -lz -lrt' и т. Д. 'LDFLAGS' является _only_ для опций, которые управляют всем компоновщиком. Канонический пример опции, принадлежащей 'LDFLAGS', является опцией' -L'. Все опции '-l', все опции, которые зависят от порядка флагов и т. Д., Принадлежат' LIBADD'. Кроме того, я бы предположил, что вам нужен '-Wl,-whole-archive', а не' -Wl, whole-archive', правильно? Или интерфейс добавляет '--' для вас? – MadScientist

+0

Помните, что компоновщик _highly_ чувствителен к выбору опций в командной строке. Было бы полезно, если бы вы разместили вырезку/вставку линии ссылок для вашей общей библиотеки, чтобы мы могли ее увидеть. – MadScientist

+0

doh, я знаю это, но, как я уже сказал, я неофит и забыл. Я изменил на это 'pyextension_la_LIBADD = -lz ...'. Я попытался добавить мой '-Wl,-whole-archive' там, но получил сообщение« позор вам »из libtool, что параметры вроде этого должны идти в' _LDFLAGS'. Итак, я переместил его туда еще раз, я ничего не вижу между '-Wl,-whole-archive -Wl, - no-whole-archive', хотя я поместил их там в' Makefile.am'. –

ответ

0

Вы можете помочь в то же самое, что помогло мне here:

-Wl,--whole-archive,$(ARCHIVE1_PATH)/archive1.a,$(ARCHIVE2_PATH)/archive2.a,--no-whole-archive 

Задание нескольких аргументов запятые к одному -Wl опции заставит Automake считать их в единое целое, а не перемещать их вокруг. Недостатком является то, что Automake не будет выяснять, что эти объектные файлы являются зависимостями вашей библиотеки, поэтому вам, возможно, придется указать и _DEPENDENCIES.