Название: Undefined symbols при компиляции Отправлено: kambala от Апрель 16, 2011, 12:54 Здравствуйте. Столкнулся с проблемой - код под Mac OS X отказывается компилироваться в режиме debug (но режим release, а также под виндой, компилируется успешно). Выводится такая ошибка:
Цитировать Undefined symbols for architecture i386: Пробовал на 4.6.3 и 4.7.2, обе собраны в режиме -debug-and-release. Другие проекты (как universal, так и нет) собираются и запускаются в режиме debug нормально."QD2CharRenamer::newNameOffset", referenced from: __ZN14QD2CharRenamer13newNameOffsetE$non_lazy_ptr in qd2charrenamer.o (maybe you meant: __ZN14QD2CharRenamer13newNameOffsetE$non_lazy_ptr) "QD2CharRenamer::oldNameOffset", referenced from: __ZN14QD2CharRenamer13oldNameOffsetE$non_lazy_ptr in qd2charrenamer.o (maybe you meant: __ZN14QD2CharRenamer13oldNameOffsetE$non_lazy_ptr) ld: symbol(s) not found for architecture i386 collect2: ld returned 1 exit status Undefined symbols for architecture ppc: "QD2CharRenamer::newNameOffset", referenced from: __ZN14QD2CharRenamer13newNameOffsetE$non_lazy_ptr in qd2charrenamer.o (maybe you meant: __ZN14QD2CharRenamer13newNameOffsetE$non_lazy_ptr) "QD2CharRenamer::oldNameOffset", referenced from: __ZN14QD2CharRenamer13oldNameOffsetE$non_lazy_ptr in qd2charrenamer.o (maybe you meant: __ZN14QD2CharRenamer13oldNameOffsetE$non_lazy_ptr) ld: symbol(s) not found for architecture ppc collect2: ld returned 1 exit status lipo: can't open input file: /var/folders/Y-/Y-+o-8ZUEUy-H0o+5VzAqU+++TI/-Tmp-//cc4A23Ll.out (No such file or directory) make: *** [QD2CharRenamer.app/Contents/MacOS/QD2CharRenamer] Error 1 make: Leaving directory `/Developer/Projects/Qt/QD2CharRenamer-build-desktop' Процесс "/usr/bin/make" завершился с кодом 2. Возникла ошибка при сборке проекта QD2CharRenamer (цель: Настольный компьютер) Во время выполнения сборки на этапе "Сборка" Две переменные, которые указаны в ошибке, объявлены так: Код а используются newNameOffset и oldNameOffset лишь в одном месте в коде: Код Пробовал убирать const у этого метода, перемещать реализацию в cpp файл, дописывать к переменным имя_класса:: - ничего не помогло. Подскажите пожалуйста как это исправить. Название: Re: Undefined symbols при компиляции Отправлено: blood_shadow от Апрель 16, 2011, 14:56 попробуй убить все объектники, меик-файлы и заново пересобрать.
на маке mingw одной версии стоит? Название: Re: Undefined symbols при компиляции Отправлено: kambala от Апрель 16, 2011, 15:31 все это пробовал, даже проект по-новой создавал - не помогает.
mingw на маке?.. у меня есть make, gcc и другие юниксовые утилиты :) Название: Re: Undefined symbols при компиляции Отправлено: blood_shadow от Апрель 16, 2011, 15:55 все это пробовал, даже проект по-новой создавал - не помогает. да точно mingw - только на винде.. у мя было подобное, когда стояло два криэтора, которые использовалиmingw на маке?.. у меня есть make, gcc и другие юниксовые утилиты :) разные версии gcc++, посмотри в переменных окружения и в настройках проекта, все ли там совпадает Название: Re: Undefined symbols при компиляции Отправлено: kambala от Апрель 16, 2011, 16:26 та вроде как все нормально там. специально еще раз пересоздал проект - все то же.
вот что пишет терминал если пользоваться им для сборки: Код
Название: Re: Undefined symbols при компиляции Отправлено: blood_shadow от Апрель 16, 2011, 16:35 та вроде как все нормально там. специально еще раз пересоздал проект - все то же. я кажется понял...вот что пишет терминал если пользоваться им для сборки: Код
вся соль в том что мак у тебя стоит на архитектуре ppc, а gcc походу для i386 вот в этих строчках - ld: symbol(s) not found for architecture i386 и ld: symbol(s) not found for architecture ppc комп давно покупался? раньше маки строились на базе архитектуры моторолы, потом ppc и современные уже i386 проверь архитектуру своего компа, если проект не большой можешь мне кинуть я попробую собрать Название: Re: Undefined symbols при компиляции Отправлено: kambala от Апрель 16, 2011, 16:39 нет, у меня как раз интеловский мак, а собираю проект я для обоих архитектур (i386 и ppc). другой проект для обоих архитектур собирается спокойно как в debug, так и в release (а этот, напомню, успешно собирается только для release).
вот ссылка на исходники: http://www.mediafire.com/?dwhl2z58gp21syx Название: Re: Undefined symbols при компиляции Отправлено: blood_shadow от Апрель 16, 2011, 16:59 нет, у меня как раз интеловский мак, а собираю проект я для обоих архитектур (i386 и ppc). другой проект для обоих архитектур собирается спокойно как в debug, так и в release (а этот, напомню, успешно собирается только для release). чувак, ну кто же так определяет статические переменные в классе?вот ссылка на исходники: http://www.mediafire.com/?dwhl2z58gp21syx ты объявил статик переменные в классе, но не определил их, то есть не выделил память, и компоновщик потом попросту не нашел эти переменные в файле *.cpp до определения конструктора надо определить их, то есть написать: Код а в файле *.h Код и все есть гуд ;) не знаю, почему такое компилятор позволяет в релиз режиме, он должен ругаться просто матом на такие вещи Название: Re: Undefined symbols при компиляции Отправлено: kambala от Апрель 16, 2011, 17:12 я как-то пытался статическую переменную типа QString определить прямо в классе - вот там компилятор ругался, а инты я думал можно :) большое спасибо, теперь буду знать!
а почему ж тогда на другие статические переменные не ругается, а только на эти? Название: Re: Undefined symbols при компиляции Отправлено: blood_shadow от Апрель 16, 2011, 17:26 я как-то пытался статическую переменную типа QString определить прямо в классе - вот там компилятор ругался, а инты я думал можно :) большое спасибо, теперь буду знать! 1. это ошибка на этапе компоновки тут дела с ошибками намного хуже чем на этапе компиляции, а почему ж тогда на другие статические переменные не ругается, а только на эти? не смог связать первую, попытался вторую, не смог вторую и выбросил ошибку, предполагая что программа в которой есть как минимум 2 неопределенные переменные, точно не может быть правильной 2. статик QString можно определить прямо в классе, семантика объявления ничем не отличается от атомарных типов, только нужно не забыть подключить соответствующий хэдер(#include <QString>), более того в в файле *.h можно сделать только предварительное объявление QString, а подключить хэдер <QString> только в файле *.cpp если только не объявляется какой-нить объект QString в хэдере 3. раньше до принятия С++98(нынешний стандарт) статические переменные объявлялись и определялись так как вы сначала сделали(одна запись), в объявлении класса, но в нынешнем стандарте лавочку прикрыли и теперь объявляем в классе, а определяем вне классов и ф-ций Название: Re: Undefined symbols при компиляции Отправлено: Igors от Апрель 17, 2011, 05:54 чувак, ну кто же так определяет статические переменные в классе? Почему, если const то так защищаться можно. У меня компилится нормально под любую архитектуру (Mac, компилятор Xcode)Название: Re: Undefined symbols при компиляции Отправлено: blood_shadow от Апрель 17, 2011, 09:49 чувак, ну кто же так определяет статические переменные в классе? Почему, если const то так защищаться можно. У меня компилится нормально под любую архитектуру (Mac, компилятор Xcode)объявлялись и определялись только раз в классе, нынешний стандарт языка запрещает такое делать, я думаю что в релиз режиме программа не вылетает с ошибкой только из-за того что эти переменные нигде не используются. к тому же причина почему запрещают объявлять таким образом статические переменные - можно забыть, а то и вовсе запутаться про особенности таких переменных Название: Re: Undefined symbols при компиляции Отправлено: Igors от Апрель 17, 2011, 10:27 так можно было раньше делать, до принятия нынешнего стандарта, статик переменные Если указан const - то не запрещаетобъявлялись и определялись только раз в классе, нынешний стандарт языка запрещает такое делать, Название: Re: Undefined symbols при компиляции Отправлено: kambala от Апрель 17, 2011, 11:29 У меня компилится нормально под любую архитектуру (Mac, компилятор Xcode) у хкода есть свой компилятор?.. у меня gcc 4.2, 64-битная ОС (если это имеет значение). а ты чем компилировал?Название: Re: Undefined symbols при компиляции Отправлено: Igors от Апрель 17, 2011, 11:40 у хкода есть свой компилятор?.. у меня gcc 4.2, 64-битная ОС (если это имеет значение). а ты чем компилировал? Тем же чем и Вы - gcc 4.2. Просто поставил архитектуру universal 32/64 (он создает 4 экземпляра Intel/PPC. 32/64). Все нормальноНазвание: Re: Undefined symbols при компиляции Отправлено: kambala от Апрель 17, 2011, 13:35 вернул определение статических переменных в хедер и попробовал собрать через хкод. я и не удивился особо.
версия gcc 4.2.1 (i686-apple-darwin10-gcc-4.2.1). Цитата: xcode Build QD2CharRenamer of project QD2CharRenamer with configuration Debug Ld build/QD2CharRenamer.build/Debug/QD2CharRenamer.build/Objects-normal/i386/QD2CharRenamer normal i386 cd /Developer/Projects/Qt/QD2CharRenamer setenv MACOSX_DEPLOYMENT_TARGET 10.4 /Developer/usr/bin/g++-4.2 -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk -L/Developer/Projects/Qt/QD2CharRenamer/build/Debug -L/Developer/Qt-4.7.2/lib -L/Developer/Qt-4.7.2/lib -F/Developer/Projects/Qt/QD2CharRenamer/build/Debug -filelist /Developer/Projects/Qt/QD2CharRenamer/build/QD2CharRenamer.build/Debug/QD2CharRenamer.build/Objects-normal/i386/QD2CharRenamer.LinkFileList -mmacosx-version-min=10.4 -headerpad_max_install_names -L/Developer/Qt-4.7.2/lib -F/Developer/Qt-4.7.2/lib -L/Developer/Qt-4.7.2/lib -F/Developer/Qt-4.7.2/lib -framework QtGui -framework QtCore -o /Developer/Projects/Qt/QD2CharRenamer/build/QD2CharRenamer.build/Debug/QD2CharRenamer.build/Objects-normal/i386/QD2CharRenamer Undefined symbols: "QD2CharRenamer::newNameOffset", referenced from: __ZN14QD2CharRenamer13newNameOffsetE$non_lazy_ptr in qd2charrenamer.o (maybe you meant: __ZN14QD2CharRenamer13newNameOffsetE$non_lazy_ptr) "QD2CharRenamer::oldNameOffset", referenced from: __ZN14QD2CharRenamer13oldNameOffsetE$non_lazy_ptr in qd2charrenamer.o (maybe you meant: __ZN14QD2CharRenamer13oldNameOffsetE$non_lazy_ptr) ld: symbol(s) not found collect2: ld returned 1 exit status Ld build/QD2CharRenamer.build/Debug/QD2CharRenamer.build/Objects-normal/ppc/QD2CharRenamer normal ppc cd /Developer/Projects/Qt/QD2CharRenamer setenv MACOSX_DEPLOYMENT_TARGET 10.4 /Developer/usr/bin/g++-4.2 -arch ppc -isysroot /Developer/SDKs/MacOSX10.5.sdk -L/Developer/Projects/Qt/QD2CharRenamer/build/Debug -L/Developer/Qt-4.7.2/lib -L/Developer/Qt-4.7.2/lib -F/Developer/Projects/Qt/QD2CharRenamer/build/Debug -filelist /Developer/Projects/Qt/QD2CharRenamer/build/QD2CharRenamer.build/Debug/QD2CharRenamer.build/Objects-normal/ppc/QD2CharRenamer.LinkFileList -mmacosx-version-min=10.4 -headerpad_max_install_names -L/Developer/Qt-4.7.2/lib -F/Developer/Qt-4.7.2/lib -L/Developer/Qt-4.7.2/lib -F/Developer/Qt-4.7.2/lib -framework QtGui -framework QtCore -o /Developer/Projects/Qt/QD2CharRenamer/build/QD2CharRenamer.build/Debug/QD2CharRenamer.build/Objects-normal/ppc/QD2CharRenamer Undefined symbols: "QD2CharRenamer::newNameOffset", referenced from: __ZN14QD2CharRenamer13newNameOffsetE$non_lazy_ptr in qd2charrenamer.o (maybe you meant: __ZN14QD2CharRenamer13newNameOffsetE$non_lazy_ptr) "QD2CharRenamer::oldNameOffset", referenced from: __ZN14QD2CharRenamer13oldNameOffsetE$non_lazy_ptr in qd2charrenamer.o (maybe you meant: __ZN14QD2CharRenamer13oldNameOffsetE$non_lazy_ptr) ld: symbol(s) not found collect2: ld returned 1 exit status Название: Re: Undefined symbols при компиляции Отправлено: Igors от Апрель 17, 2011, 14:02 Вот уж не знаю - мне завалить никак не удается :)
Если есть желание - выложите минимальный компилябельный проект Название: Re: Undefined symbols при компиляции Отправлено: kambala от Апрель 17, 2011, 14:17 уже ж постил ссылку :)
вот ссылка на исходники: http://www.mediafire.com/?dwhl2z58gp21syx Название: Re: Undefined symbols при компиляции Отправлено: Igors от Апрель 17, 2011, 15:36 Да, с оригиналом у меня те же ошибки линковки.
Можно уговорить так Код Или так Код Т.е. не нравится условный оператор. Почему - не знаю :) Название: Re: Undefined symbols при компиляции Отправлено: kambala от Апрель 17, 2011, 15:46 тогда уж лучше следовать стандарту ;)
|