2010-09-14 5 views
2

У меня проблема с попыткой использовать autotools для простого надуманного проекта, задача проста, используйте Objective-C на Mac OSX и C++ на Windows (mingw) - с некоторым клеем C середина.Компиляция на Windows и Mac с помощью Autotool

Проект построен как так (минус все автоматически сгенерированные файлы):

./aclocal.m4 
    ./configure 
    ./configure.ac 
    ./Makefile.am 
    ./src/darwin/greet.m 
    ./src/greet.h 
    ./src/main.cpp 
    ./src/Makefile.am 
    ./src/mingw32/greet.cpp  

Содержание ключевых файлов здесь на github in a gist. (Не хотел спам здесь)

Я использую следующую команду между изменениями:

$ autoreconf -vis && ./configure && make 

Ошибка я получаю на полную мощность (here in another gist):

.... 
Making all in src 
g++ -g -O2 -o greetings main.o 
Undefined symbols: 
    "greet()", referenced from: 
     _main in main.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make[1]: *** [greetings] Error 1 
make: *** [all-recursive] Error 1 

I «Я очень новичок в autotools, и прошел долгий путь с помощью пары хороших людей в IRC, но я думаю, что я делаю концептуальную ошибку здесь, на самом деле надеюсь, что есть простая ошибка, которую я делаю.

Было моим пониманием из документов, что EXTRA_progname_SOURCES должно содержать все возможные файлы и что условные обозначения, которые устанавливаются, должны работать, чтобы выбрать правильные.

Тревожно, я не думаю, что мои make-файлы переделываются, потому что даже когда я меняю строку в src/Makefile.am, чтобы включить источники явно для моей платформы (это Max OS X Darwin, большую часть времени) - выход остается совершенно одинаковым.

+2

Это ошибка компоновщика. Forger об автотестах, просто попытайтесь понять, почему функция greet не найдена. Где это должно быть - в каком-то другом файле .c/.cpp или в некоторых лирических? –

+0

Alex, функция определена в заголовке 'src/greet.h' с реализацией на платформе (чтение: использует Objective-C, другие C++) в' src/darwin/greet.mm', а другое в 'src/mingw31/greet.cpp' –

+0

Если я переработаю свою команду как '$ autoreconf -vis && ./configure && make clean && make' (обратите внимание на добавление make clean) - тогда я вижу гораздо более интересную ошибку:' g ++ -DPACKAGE_NAME = \ "приветствия \" -DPACKAGE_TARNAME = \ "приветствия \" -DPACKAGE_VERSION = \ "1.0 \" -DPACKAGE_STRING = \ "приветствия \ 1.0 \" -DPACKAGE_BUGREPORT = \ "[email protected] \" -DPACKAGE_URL = \ "\" -DPACKAGE = \ "greetings \" -DVERSION = \ "1.0 \" -I. -g -O2 -MT main.o -MD -MP -MF $ depbase.Tpo -c -o main.o main.cpp && mv -f $ depbase.Tpo $ depbase.Po' (https: //gist.github .com/f5ef9704267c7284c853) –

ответ

1

Я вижу, что вы имеете в виду greet.mm в самом начале, но greet.m в вопросе. Automake не отображается для natively support Код Objective-C++. Для кода Objective-C у вас должно быть AC_PROG_OBJC в вашем configure.ac. Если вы действительно имели в виду код Objective-C++, вам нужно сделать это via a suffix rule.

+0

Джек, спасибо за подсказку, я рассмотрю это сегодня, если найду какое-то время. –

+0

Вы были правы, как только я исправил 'Makefile.am', чтобы искать файлы' .m', 'autoreconf' предупредил меня, что я должен добавить' AC_PROG_OBJC' в 'configure.ac' - в это время список файлы, переданные компилятору, были завершены, но оставили мне все еще проблемы с компоновщиками, с которыми я работаю. –

+0

@Beaks: Какова ваша версия automake ('automake --version')? –

0

г ++ -g -O2 -o привет main.o

Эта линия пытается построить приветствия исполняемые от main.o. Если функция Приветствуйте() определяется в какой-либо другой файл, например, greet.cpp, он должен быть:

++ -g -O2 -o привет main.o greet.o

Возможно, эта линия от Makefile.am

greetings_SOURCES = main.cpp greet.h

должно быть что-то вроде этого:

greetings_SOURCES = main.cpp greet.cpp

В Makefile.am у вас есть:

 
if OS_DARWIN 
greetings_SOURCES += darwin/greet.mm 
endif 
if OS_MINGW32 
greetings_SOURCES += mingw32/greet.cpp 
endif 

Это место, которое выполнено неправильно. Вам нужно проверить это.

+0

Подтверждено, но я не знаю достаточно об autotools, чтобы отладить это, что вы можете предложить? –

+1

Постарайтесь сменить greetings_SOURCES безоговорочно, добавив к нему требуемый файл .cpp. Он решает эту проблему, это означает, что «if» или + = не выполняется, как ожидалось. Если вы работаете с autotools, прочитайте эту книгу: http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool –

+0

Я просто сделал небольшой тест, используя только файлы '.c': кажется безопасным + = a' foo_SOURCES 'variable, если все указано в' EXTRA_foo_SOURCES'. –