трактат на тему КАК Я ПИСАЛ ДИПЛОМ
ОН НАКАТАЛ много, прочитаю позже
отсюда dr-demon.blogspot.ru/2010/03/blog-post.html
Как я диплом писал МНОГО
Начну с того, что я идеалист. Ленивый идеалист. Это когда вроде бы знаешь, что должно быть так, а не иначе. И что ты должен сделать это, потому что нужно. Но ничего не получается, потому что лень пронизывает тебя до костей, и при этом ты остаёшься идеалистом. Забавно получается. Такая вот комбинация.
В наше время люди привыкли плыть по течению. И хоть эта тема избита всеми возможными и невозможными способами, внести в неё свои пять копеек всё таки хочется. Вот так же, как и все, или как большая часть населения Земли, я плыл по течению до некоторых пор. До тех пор, пока мне не приелся один и тот же пейзаж.
За один вечер, щелкая семечки и смотря на суету людей с высокого холма у дома, было решено начать делать какие-то спонтанные шаги из тех, что не приведут меня слишком быстро к нищете и голоданию. Вот от чего не хотелось бы умереть, так это от голода. И если мне суждено попасть в такое место, как ад, я бы хотел перед этим сытно поесть свежесвареных пельмешек со сметаной.
Ну так о чём я. Ах да, о дипломе. Так случилось, что я поступил на программиста. Это было после того как я решил "спонтанить" потихоньку. Просто было дико скучно. Было скучно всё время сколько себя помню. В школе с этими уроками. Учителя, друзья. И даже банальное отсутствие мест куда бы можно было пойти поразвлечься. Просто тупое просиживание на скамейке или выпивание пива с кем-то было скучней чем смотреть балет по телевизору. Поэтому я даже учился по следующей схеме: ничего не учил. А потом в последний день до контрольной или экзамена пролистывал учебничег и сдавал всё как нужно. Правда были проколы по математике, потому что не гений, и видимо систематизма нужно было больше. Зато как хорошо было ощущать прилив адреналина, хоть и не большой, когда предвидится жопа, а вот её и нет вдруг. Вот и доигрался, что учитка по русскому языку запуршила и поставила мне четвёрку за год в одиннадцатом классе. Большое вам спасибо Ирина Леонидовна, чесслово, развлекли :-)
Но вот когда поступил в универ, всё изменилось. Люди, так сказать, другие немного в универ приходят. Вроде бы за знаниями. Преподы все такие интересные и жизнерадостные. На первых курсах все шуганые, некоторые без башни. Весело, зашибись. Сразу было решено не продолжать эпопею с учёбой на отлично, а учиться абы как. Но вот в чём не стыдно признаться, так это в том, что профильные предметы, особо по програму, - мне нравились. Этим и увлёкся. Всякие паскали, потом С и они же с плюсами. Ассемблер по Калашникову. Ох вспоминаю как сидел ночью в турбо дебагере отлаживал асмовский резидент. Вот это было да-а-а-а.. И как это ни странно, перездавая хотя бы пару раз хотя бы половину предметов, я таки доучился до пятого курса и даже сдал гос! Забыв на госе как называется девайс именуемый свитчем :-). А всему виной игра S.T.A.L.K.E.R за ночь до госа, и мои непутёвые мозги.
Забыл рассказать о том, как я познакомился с Линуксом. Это такая операционная система. Впервые я поставил её на курсе третьем что ли. Поставил правда FreeBSD по-моему шестой версии. Посмотрел, ужаснулся этой командной строке и снёс нафик. Потом на хабре мне постоянно мозолили глаза статейки каких-то людей айтишников, которые восторгались этой прекрасной операционкой и еще что-то там умудрялись в ней делать. На пятом курсе я наконец решил предпринять вторую попытку. Поставил убунту, которую в конвертике прислали через два месяца после запроса. Поставил и начал ковырять. В первый же день удалил всё из корня, наблюдая как забавно рушится гуй, пропадают иконки и всё прочее. Поставил ещё раз. Убил систему после того как скопипастил несколько строчек скрипта и запустил на выполнение, после чего был отформатирован жёсткий диск . Да-да. Даже такое бывает. И статью в принципе можно смело называть "Как нуб писал диплом". Короче говоря, начинаем писать про диплом, ато введение какое-то большое сильно.
Похвалился я однажды преподавателю Анатолию Борисовичу что знаю линукс. Ну и вправду, выучил с десяток команд, понаписал несколько десятков раз make и install. Вот и знаю вроде как ))).
А Борисович как раз работал над одной системой по имени СПАД. Типо СПисок АДресов. Как позже выяснится, для этой системы больше подошло бы название "Сишный Полу-АД". Не потому что написано криво, или ещё что-то там. Борисович хорошо знает язык и имеет опыт за плечами. Но я как-то не привык к нескольким десяткам функций вызывающим друг друга по каким-то своим неписанным законам и к напрочь отсутствующей документации для разработчика.
Вот, значит, Борисович и предложил мне сделать так, чтобы этот СПАД в виде динамической библиотеки начал работать и под линуксом. А я, чтобы мой язык приколотили гвоздём к чему-нибудь неприятному и бьющему током, сказал слегонца так "окей Анатолий Борисович, ноу проблем!". С этого дня начался неописуемый кошмар.
День первый. Копипаст.
Как быстрей всего портировать что-либо? Скопипастить! А потом поправить всё что нужно. Так я и сделал. Аккуратно скопипастил хидер и сишник в QtCreator, в коем решил прогить это добро. Скопипастил, и как и ожидалось, увидел длинющий список всяких ворненгов и штук десять ошибок. Долго ковырялся, устранил одну треть ворнингов. Остальные остались непонятыми и наскучили. Решил взяться за ошибки. Ошибки, которых не должно быть, потому что всё писалось на С++ в борландах, без вцл-ей всяких. Убрал враперы, без которых в борландах не обойтись, поменял несколько жесточайших конструкций типа return (void*&) &this; на нечто полегче. А в линуксах используется GCC, что есмь GNU C Compiler. Вот в нём такие конструкции напрочь отказывались нормально восприниматься. Так я и не понял почему. Скорее всего потому, что GCC строго придерживается спецификаций, а борланды (далее быдлеры, от быдло борланды. или проще говоря - быдлокодо борланд билдер. пусть ваша фантазия здесь разыграется) то ли расширяют свой компилер, то ли там еще какие-то причиндалы добавляют, но позволяют себе немного больше чем гну.
Не прошло и полуночи, и выпивши пару чашек кофею таки удалось слинковать и смейкить либу. Ох, как здорово.
Ну, усталый голодный и злой, но весьма довольный собой я собрался на покой. Лёг на кушетку и проспал до вечера.
День второй. Как я писал хост-приложение.
Под хост-приложением будем понимать такую программулину, которая вот эту самую библу, смейкеную ночью, будет юзать. И показывать, что вся чехарда в этой библе работает.
Признаюсь в том, что в QtDesigner-е довольно приятно фигачить гуй. Рассс! И на тебе форма. Двассс! И на тебе кнопочка. Одно загляденье. Особо я не торопился. Мне в детстве нравилось рисовать, и видать с тех времён что-то сохранилось в моём глючном мозгу. Поэтому добрых три часа я занимался только построением этого гуя. И когда всё было готово, создал обработчик нажатия на кнопочку, чтобы при нажатии подгружалась библа с помощью QLibrary. Аккуратно так заинклудив хидер от библы в проект.
Собираем, компиляем, на кнопочку нажимаем. И-и-и опа!! Библиотека не найдена. Хотя вроде скопировал эти *.so файлы в папку с гуишным проектом. Что за ерунда такая.. Ведь помню что под виндами достаточно библу скопировать в папку с приложением, которое собирается юзать её. А тут не работает. Начинаю гуглить. Гуглю, гуглю, гуглю, гуглю. Гуглю. Ещё гуглю. Погуглил, нашёл на форуме схожую проблему. Там посоветовали погуглить ещё. Погуглил ещё. Часа два гуглил. Вот когда меня спросят, на что я потратил большую часть своей жизни, я с уверенностью отвечу: на гугление! И если присмотреться, то всякий программист чуть более чем наполовину гуглер, и уж потом возможно кодер, и уж потом возможно программист, и после этого возможно даже не худой и волосатый, как принято считать.
И как оказалось, дорогие мои волосатые собраться по разуму, нужно было сделать одно из трёх:
скопировать библы в папочку с хостовым приложением, и добавить в PATH путь "./", То есть путь к текущей директории запущенного приложения. Тогда бы всё подтянулось. Но остались бы проблемы в среде разработки QtCreator. Поскольку для него не видна была бы эта библа, а без неё он ни в какую не собирёт проект. Как его не пинай. Значит этот вариант в моём случае не рабочий. Это если релиз уже делать, то можно сделать так, чтобы установщик сделал сию манипуляцию с переменной окружения.
как оказалось, да да, как оказалось, существует такая папка "/lib" ! Тараааам! И она существует специально для того, чтобы скидывать туда свои библы. Именно так думал мой куриный мозг, будучи уверенным в том, что он таки знает линукс :-). Как позже выяснилось, есть алиас этой папки в каталоге "/usr/lib". Дабы юзерский хлам был помещён туда, и не смешивался с дзенолибами от великой тысячи разработчиков линукса. Туда я и скопировал свою либу. То есть либу Борисовича. Но потом уже, позже я узнал, что достаточно было оставить либу там где она была создана, и в /usr/lib сделать символическую ссылку на неё. Всё приходит с опытом и с дополнительной парой часов гугления. Ох уж это гугление.
Но не всё так просто. Оказалось, что я умудрился поставить себе 64-хбитный openSUSE. И там есть ещё и папочка /lib64 и соответственно /usr/lib64. Вот когда я создал символическую ссылку в последней, тогда наконец всё пошло поехало, как по маслу. Собирай, компиляй, собирай компиляй! Гуйное чудо наконец собралось, и запыхтев, подобрав тяжеловесные QtCore, QtGui и libSpad.so собственной персоной, запустилось. О хвала небесам! Первый этап пройден, можно считать, что всё работает, и здоровый кец диплома вроде бы написан. Теперь можно позырить любимый сериал, кушая арахис, утречком на пробежку, а потом опять дрыхнуть весь день. Ведь гуглил то я много, всю ночь :-)
День третий. Как я тупил.
Весь хелп по QLibrary перевернул но так и не нашёл способ использовать функции из библы без получения ссылок на них. И поэтому в отдельном хидере у меня наблюдался такой вот кошмар на двести строк:
typedef int (*_MybSpadSbsGet)( char* Buff, int Len, spad* pSpad, int NomSubst );
typedef int (*_MybSpadStSet)( spad* pSpad, char* sDat );
typedef int (*_MybSpadIpSet)( spad* pSpad, char* Ip );
typedef int (*_MybAsSp)( void *pt );
typedef int (*_MybSpadIpLen)( spad* pSpad );
typedef int (*_MybSpadStLen)( spad* pSpad );
typedef int (*_MySpadSbsLen)( spad* pSpad, int NomSubst );
typedef int (*_MyBuffSubstGet)( char* Buff, int NomSubst, char* pc );
Всё работало, но было жутко неприятно и стыдно, и мой нубский мозг даже стал сомневаться в праведности линукса. Последующие часы я провёл за гуглением и вот что выяснилось.
Поскольку юзается qmake и далее компилится gcc, то в .pro файле можно писать опции, которые будут переданы им. В их число входит также параметр -Lпуть , дабы указать, что по тому пути можно найти необходимые библы. А также параметр -lбибла , дабы указать, что это библа, которая должна использоваться в приложении. Причём сама библа должна быть названа libбибла.so, либо libбибла.so.1, либо libбибла.so.1.0, либо libбибла.so.1.0.0, и так далее. На самом деле исходная библа - это libбибла.so, а остальные - просто символические ссылки на неё.
Далее мне осталось добавить в проектный файл такую строчку: LIBS += -lSpad, которая впоследствии будет передана компилеру, который уже поймёт, что ему нужно подтянуть соответствующую библу из юзерских библ в /usr/lib64. И только после этого можно насладиться сладким вкусом библиотеки не используя приведённый выше вырвиглаз.
Выяснение сиих азов заняло у меня весь вечер и большую часть ночи. И всё потому, что сунулся в это дело, не зная многих других вещей, не привыкши читать мануалы по GCC. И вообще всему виной патологическая лень, которая имеет место в бренной голове моего студента.
День четвёртый. Как я дебажил.
Вы когда-нибудь задумывались о процессе дебужинья, дебажинья, дебагинга, дебугинга или просто дебага?
Вот мы желаем задебажить нашу программулину. Нажимаем F5. Пошаговое выполнение обеспечивает останов после каждой инструкции программы. Всё начинается с загрузки значения TF=1 в регистре флагов EFLAGS. Кажется это восьмой бит. Далее возникает исключение пошагового режима в виде ловушки после выполнения команды, если этот самый TF был возведён. Есть и другие методы, такие например как прерывание контрольной точки, что под номером 3. Далее идёт целый слой самого дебагера, который корректирует код и осуществляет прыжок по адресу следующему за командой INT3. Процесс очень трудоёмкий и сложный.
И что самое интересное, - вся эта махина из тысяч строк кода, всё это убожество которое я зафигачил, и которое ещё подтягивает пятнадцать метров библиотек, - всё это останавливается при возведении одного единственного бита! Ну разве не чудесен мир программирования?
По традиции GNU, в линуксе основным и самым успешным дебагером является GDB - GNU Debuger. Его, как оказалось, можно использовать довольно легко прямо в консоли. К тому же, он оказался кроссплатформенным, что не может не радовать. Хотя всё равно мне лень его использовать в консоли, поэтому можно подыскать для него гуйную обёртку. Или даже использовать сам QtCreator в качестве такой обёртки.
А к дебагингу меня привёл тот факт, что функции не работают так, как от них ожидалось. Ну не работают, и хоть ты с бубном, хоть с двумя, хоть тресни, не работают. И вот, всю ночь, и всё утро, я дебажил эту чудесную библиотеку, выпивая через каждых пару часов чашечку горячего кофе, запоминая наизусть целые куски кода и помня где какая переменная объявлена, и даже зная на каком шаге какое значение каждая из них принимает. И даже вроде бы начал понимать как это всё безобразие работает. Но, кода так много и он такой жосткий и запутанный, что чёрт ногу сломит, а я - последнюю извилину, что ещё не успела нагреться до критической температуры. К обеду посмотрев на себя в зеркало, я увидел там неведомое мне существо с красными гляделками, белой пеной у рта (оказалось - остатки молока с кофе) и растрёпаными волосами. Сразу вспомнился "яковозавр" в одной из серий сауспарка. В таком состоянии я упал бревном в нерасстеленую кровать и провалялся там весь день, а потом всю ночь. И после этого несколько дней занимался другими делами, не желая вспоминать ночной кошмар с нулевым результатом в итоге.
Просветление. Или опыт дурака.
Последующая неделя прошла как один сплошной отходняк. Занимался чем угодно, только не дипломом. Периодически запускал креатор, но посмотрев на печально запомнившиеся строки я в ужосе нажимал на крестик в уголке и запускал какой-то фиговый фильм, скачаный с медиа-портала моего провайдера. Тут и терминатор был, и хищник, и чужой, и чужой против хищника, и какой-то конфуций чёрт его заберай, алиса в стране чудес, доктор хаус и лост, и чего только не перезырил. К слову, очень удобным оказался и неприхотливым wget. Как привык к нему - не могу нарадоваться. Даже гуй под него не хотелось искать. Ещё заметил, что uptime моей системы составляет 18 дней, и это рекорд. Во времена юзания форточек эти форточки падали и скрипели уже через неделю. Даже вин7.
Вобщем, с таким вот печальным результатом я пришёл в универ, и рассказал всем о своей неудаче. И во время этих рассказов мне закралась в голову мысль, что линукс то у меня установлен 64-хбитный. А СПАД прогился на 32-хбитной платформе. Вот что значит чуточку поговорить с однокурсниками. А ведь я почти не разговаривал ни с кем всю неделю, и возможно если бы я сделал это раньше, то эта мысль пришла бы мне в сохранившуюся от перегрева извилину чуть быстрей.
В тот же день пришлось решать проблему с установкой VirtualBox на openSUSE с пересборкой ядра, что не мог сделать на протяжении полумесяца. В нём создал машину убунты 32-хбитной. Поставил её. Расшарил папочку с проектом, смонтировал в дочерней оси, запустил. Собирай компиляй, собирай компиляй. Запускай, проверяй. И о чудо! Возвращается результат, который ожидается! Ощущение сродни тому, как долго хотел полить огород соседа, и наконец добежав до него, глядя в небо, расслабляешься и чувствуешь себя счастливым.
Впоследствии оказалось, что всё равно не всё работает так как нужно, но судя по всему это из-за тех жостких (void*&) &this, которые я вроде как "поправил". Так что, буду разбираться, ведь осталась ещё неделя до сдачи программного продукта на проверку.
А читателю желаю быть проницательней, побольше гуглить и читать спецификаций и мануалов. И продуктивных ночей
ОН НАКАТАЛ много, прочитаю позже
отсюда dr-demon.blogspot.ru/2010/03/blog-post.html
Как я диплом писал МНОГО
Начну с того, что я идеалист. Ленивый идеалист. Это когда вроде бы знаешь, что должно быть так, а не иначе. И что ты должен сделать это, потому что нужно. Но ничего не получается, потому что лень пронизывает тебя до костей, и при этом ты остаёшься идеалистом. Забавно получается. Такая вот комбинация.
В наше время люди привыкли плыть по течению. И хоть эта тема избита всеми возможными и невозможными способами, внести в неё свои пять копеек всё таки хочется. Вот так же, как и все, или как большая часть населения Земли, я плыл по течению до некоторых пор. До тех пор, пока мне не приелся один и тот же пейзаж.
За один вечер, щелкая семечки и смотря на суету людей с высокого холма у дома, было решено начать делать какие-то спонтанные шаги из тех, что не приведут меня слишком быстро к нищете и голоданию. Вот от чего не хотелось бы умереть, так это от голода. И если мне суждено попасть в такое место, как ад, я бы хотел перед этим сытно поесть свежесвареных пельмешек со сметаной.
Ну так о чём я. Ах да, о дипломе. Так случилось, что я поступил на программиста. Это было после того как я решил "спонтанить" потихоньку. Просто было дико скучно. Было скучно всё время сколько себя помню. В школе с этими уроками. Учителя, друзья. И даже банальное отсутствие мест куда бы можно было пойти поразвлечься. Просто тупое просиживание на скамейке или выпивание пива с кем-то было скучней чем смотреть балет по телевизору. Поэтому я даже учился по следующей схеме: ничего не учил. А потом в последний день до контрольной или экзамена пролистывал учебничег и сдавал всё как нужно. Правда были проколы по математике, потому что не гений, и видимо систематизма нужно было больше. Зато как хорошо было ощущать прилив адреналина, хоть и не большой, когда предвидится жопа, а вот её и нет вдруг. Вот и доигрался, что учитка по русскому языку запуршила и поставила мне четвёрку за год в одиннадцатом классе. Большое вам спасибо Ирина Леонидовна, чесслово, развлекли :-)
Но вот когда поступил в универ, всё изменилось. Люди, так сказать, другие немного в универ приходят. Вроде бы за знаниями. Преподы все такие интересные и жизнерадостные. На первых курсах все шуганые, некоторые без башни. Весело, зашибись. Сразу было решено не продолжать эпопею с учёбой на отлично, а учиться абы как. Но вот в чём не стыдно признаться, так это в том, что профильные предметы, особо по програму, - мне нравились. Этим и увлёкся. Всякие паскали, потом С и они же с плюсами. Ассемблер по Калашникову. Ох вспоминаю как сидел ночью в турбо дебагере отлаживал асмовский резидент. Вот это было да-а-а-а.. И как это ни странно, перездавая хотя бы пару раз хотя бы половину предметов, я таки доучился до пятого курса и даже сдал гос! Забыв на госе как называется девайс именуемый свитчем :-). А всему виной игра S.T.A.L.K.E.R за ночь до госа, и мои непутёвые мозги.
Забыл рассказать о том, как я познакомился с Линуксом. Это такая операционная система. Впервые я поставил её на курсе третьем что ли. Поставил правда FreeBSD по-моему шестой версии. Посмотрел, ужаснулся этой командной строке и снёс нафик. Потом на хабре мне постоянно мозолили глаза статейки каких-то людей айтишников, которые восторгались этой прекрасной операционкой и еще что-то там умудрялись в ней делать. На пятом курсе я наконец решил предпринять вторую попытку. Поставил убунту, которую в конвертике прислали через два месяца после запроса. Поставил и начал ковырять. В первый же день удалил всё из корня, наблюдая как забавно рушится гуй, пропадают иконки и всё прочее. Поставил ещё раз. Убил систему после того как скопипастил несколько строчек скрипта и запустил на выполнение, после чего был отформатирован жёсткий диск . Да-да. Даже такое бывает. И статью в принципе можно смело называть "Как нуб писал диплом". Короче говоря, начинаем писать про диплом, ато введение какое-то большое сильно.
Похвалился я однажды преподавателю Анатолию Борисовичу что знаю линукс. Ну и вправду, выучил с десяток команд, понаписал несколько десятков раз make и install. Вот и знаю вроде как ))).
А Борисович как раз работал над одной системой по имени СПАД. Типо СПисок АДресов. Как позже выяснится, для этой системы больше подошло бы название "Сишный Полу-АД". Не потому что написано криво, или ещё что-то там. Борисович хорошо знает язык и имеет опыт за плечами. Но я как-то не привык к нескольким десяткам функций вызывающим друг друга по каким-то своим неписанным законам и к напрочь отсутствующей документации для разработчика.
Вот, значит, Борисович и предложил мне сделать так, чтобы этот СПАД в виде динамической библиотеки начал работать и под линуксом. А я, чтобы мой язык приколотили гвоздём к чему-нибудь неприятному и бьющему током, сказал слегонца так "окей Анатолий Борисович, ноу проблем!". С этого дня начался неописуемый кошмар.
День первый. Копипаст.
Как быстрей всего портировать что-либо? Скопипастить! А потом поправить всё что нужно. Так я и сделал. Аккуратно скопипастил хидер и сишник в QtCreator, в коем решил прогить это добро. Скопипастил, и как и ожидалось, увидел длинющий список всяких ворненгов и штук десять ошибок. Долго ковырялся, устранил одну треть ворнингов. Остальные остались непонятыми и наскучили. Решил взяться за ошибки. Ошибки, которых не должно быть, потому что всё писалось на С++ в борландах, без вцл-ей всяких. Убрал враперы, без которых в борландах не обойтись, поменял несколько жесточайших конструкций типа return (void*&) &this; на нечто полегче. А в линуксах используется GCC, что есмь GNU C Compiler. Вот в нём такие конструкции напрочь отказывались нормально восприниматься. Так я и не понял почему. Скорее всего потому, что GCC строго придерживается спецификаций, а борланды (далее быдлеры, от быдло борланды. или проще говоря - быдлокодо борланд билдер. пусть ваша фантазия здесь разыграется) то ли расширяют свой компилер, то ли там еще какие-то причиндалы добавляют, но позволяют себе немного больше чем гну.
Не прошло и полуночи, и выпивши пару чашек кофею таки удалось слинковать и смейкить либу. Ох, как здорово.
Ну, усталый голодный и злой, но весьма довольный собой я собрался на покой. Лёг на кушетку и проспал до вечера.
День второй. Как я писал хост-приложение.
Под хост-приложением будем понимать такую программулину, которая вот эту самую библу, смейкеную ночью, будет юзать. И показывать, что вся чехарда в этой библе работает.
Признаюсь в том, что в QtDesigner-е довольно приятно фигачить гуй. Рассс! И на тебе форма. Двассс! И на тебе кнопочка. Одно загляденье. Особо я не торопился. Мне в детстве нравилось рисовать, и видать с тех времён что-то сохранилось в моём глючном мозгу. Поэтому добрых три часа я занимался только построением этого гуя. И когда всё было готово, создал обработчик нажатия на кнопочку, чтобы при нажатии подгружалась библа с помощью QLibrary. Аккуратно так заинклудив хидер от библы в проект.
Собираем, компиляем, на кнопочку нажимаем. И-и-и опа!! Библиотека не найдена. Хотя вроде скопировал эти *.so файлы в папку с гуишным проектом. Что за ерунда такая.. Ведь помню что под виндами достаточно библу скопировать в папку с приложением, которое собирается юзать её. А тут не работает. Начинаю гуглить. Гуглю, гуглю, гуглю, гуглю. Гуглю. Ещё гуглю. Погуглил, нашёл на форуме схожую проблему. Там посоветовали погуглить ещё. Погуглил ещё. Часа два гуглил. Вот когда меня спросят, на что я потратил большую часть своей жизни, я с уверенностью отвечу: на гугление! И если присмотреться, то всякий программист чуть более чем наполовину гуглер, и уж потом возможно кодер, и уж потом возможно программист, и после этого возможно даже не худой и волосатый, как принято считать.
И как оказалось, дорогие мои волосатые собраться по разуму, нужно было сделать одно из трёх:
скопировать библы в папочку с хостовым приложением, и добавить в PATH путь "./", То есть путь к текущей директории запущенного приложения. Тогда бы всё подтянулось. Но остались бы проблемы в среде разработки QtCreator. Поскольку для него не видна была бы эта библа, а без неё он ни в какую не собирёт проект. Как его не пинай. Значит этот вариант в моём случае не рабочий. Это если релиз уже делать, то можно сделать так, чтобы установщик сделал сию манипуляцию с переменной окружения.
как оказалось, да да, как оказалось, существует такая папка "/lib" ! Тараааам! И она существует специально для того, чтобы скидывать туда свои библы. Именно так думал мой куриный мозг, будучи уверенным в том, что он таки знает линукс :-). Как позже выяснилось, есть алиас этой папки в каталоге "/usr/lib". Дабы юзерский хлам был помещён туда, и не смешивался с дзенолибами от великой тысячи разработчиков линукса. Туда я и скопировал свою либу. То есть либу Борисовича. Но потом уже, позже я узнал, что достаточно было оставить либу там где она была создана, и в /usr/lib сделать символическую ссылку на неё. Всё приходит с опытом и с дополнительной парой часов гугления. Ох уж это гугление.
Но не всё так просто. Оказалось, что я умудрился поставить себе 64-хбитный openSUSE. И там есть ещё и папочка /lib64 и соответственно /usr/lib64. Вот когда я создал символическую ссылку в последней, тогда наконец всё пошло поехало, как по маслу. Собирай, компиляй, собирай компиляй! Гуйное чудо наконец собралось, и запыхтев, подобрав тяжеловесные QtCore, QtGui и libSpad.so собственной персоной, запустилось. О хвала небесам! Первый этап пройден, можно считать, что всё работает, и здоровый кец диплома вроде бы написан. Теперь можно позырить любимый сериал, кушая арахис, утречком на пробежку, а потом опять дрыхнуть весь день. Ведь гуглил то я много, всю ночь :-)
День третий. Как я тупил.
Весь хелп по QLibrary перевернул но так и не нашёл способ использовать функции из библы без получения ссылок на них. И поэтому в отдельном хидере у меня наблюдался такой вот кошмар на двести строк:
typedef int (*_MybSpadSbsGet)( char* Buff, int Len, spad* pSpad, int NomSubst );
typedef int (*_MybSpadStSet)( spad* pSpad, char* sDat );
typedef int (*_MybSpadIpSet)( spad* pSpad, char* Ip );
typedef int (*_MybAsSp)( void *pt );
typedef int (*_MybSpadIpLen)( spad* pSpad );
typedef int (*_MybSpadStLen)( spad* pSpad );
typedef int (*_MySpadSbsLen)( spad* pSpad, int NomSubst );
typedef int (*_MyBuffSubstGet)( char* Buff, int NomSubst, char* pc );
Всё работало, но было жутко неприятно и стыдно, и мой нубский мозг даже стал сомневаться в праведности линукса. Последующие часы я провёл за гуглением и вот что выяснилось.
Поскольку юзается qmake и далее компилится gcc, то в .pro файле можно писать опции, которые будут переданы им. В их число входит также параметр -Lпуть , дабы указать, что по тому пути можно найти необходимые библы. А также параметр -lбибла , дабы указать, что это библа, которая должна использоваться в приложении. Причём сама библа должна быть названа libбибла.so, либо libбибла.so.1, либо libбибла.so.1.0, либо libбибла.so.1.0.0, и так далее. На самом деле исходная библа - это libбибла.so, а остальные - просто символические ссылки на неё.
Далее мне осталось добавить в проектный файл такую строчку: LIBS += -lSpad, которая впоследствии будет передана компилеру, который уже поймёт, что ему нужно подтянуть соответствующую библу из юзерских библ в /usr/lib64. И только после этого можно насладиться сладким вкусом библиотеки не используя приведённый выше вырвиглаз.
Выяснение сиих азов заняло у меня весь вечер и большую часть ночи. И всё потому, что сунулся в это дело, не зная многих других вещей, не привыкши читать мануалы по GCC. И вообще всему виной патологическая лень, которая имеет место в бренной голове моего студента.
День четвёртый. Как я дебажил.
Вы когда-нибудь задумывались о процессе дебужинья, дебажинья, дебагинга, дебугинга или просто дебага?
Вот мы желаем задебажить нашу программулину. Нажимаем F5. Пошаговое выполнение обеспечивает останов после каждой инструкции программы. Всё начинается с загрузки значения TF=1 в регистре флагов EFLAGS. Кажется это восьмой бит. Далее возникает исключение пошагового режима в виде ловушки после выполнения команды, если этот самый TF был возведён. Есть и другие методы, такие например как прерывание контрольной точки, что под номером 3. Далее идёт целый слой самого дебагера, который корректирует код и осуществляет прыжок по адресу следующему за командой INT3. Процесс очень трудоёмкий и сложный.
И что самое интересное, - вся эта махина из тысяч строк кода, всё это убожество которое я зафигачил, и которое ещё подтягивает пятнадцать метров библиотек, - всё это останавливается при возведении одного единственного бита! Ну разве не чудесен мир программирования?
По традиции GNU, в линуксе основным и самым успешным дебагером является GDB - GNU Debuger. Его, как оказалось, можно использовать довольно легко прямо в консоли. К тому же, он оказался кроссплатформенным, что не может не радовать. Хотя всё равно мне лень его использовать в консоли, поэтому можно подыскать для него гуйную обёртку. Или даже использовать сам QtCreator в качестве такой обёртки.
А к дебагингу меня привёл тот факт, что функции не работают так, как от них ожидалось. Ну не работают, и хоть ты с бубном, хоть с двумя, хоть тресни, не работают. И вот, всю ночь, и всё утро, я дебажил эту чудесную библиотеку, выпивая через каждых пару часов чашечку горячего кофе, запоминая наизусть целые куски кода и помня где какая переменная объявлена, и даже зная на каком шаге какое значение каждая из них принимает. И даже вроде бы начал понимать как это всё безобразие работает. Но, кода так много и он такой жосткий и запутанный, что чёрт ногу сломит, а я - последнюю извилину, что ещё не успела нагреться до критической температуры. К обеду посмотрев на себя в зеркало, я увидел там неведомое мне существо с красными гляделками, белой пеной у рта (оказалось - остатки молока с кофе) и растрёпаными волосами. Сразу вспомнился "яковозавр" в одной из серий сауспарка. В таком состоянии я упал бревном в нерасстеленую кровать и провалялся там весь день, а потом всю ночь. И после этого несколько дней занимался другими делами, не желая вспоминать ночной кошмар с нулевым результатом в итоге.
Просветление. Или опыт дурака.
Последующая неделя прошла как один сплошной отходняк. Занимался чем угодно, только не дипломом. Периодически запускал креатор, но посмотрев на печально запомнившиеся строки я в ужосе нажимал на крестик в уголке и запускал какой-то фиговый фильм, скачаный с медиа-портала моего провайдера. Тут и терминатор был, и хищник, и чужой, и чужой против хищника, и какой-то конфуций чёрт его заберай, алиса в стране чудес, доктор хаус и лост, и чего только не перезырил. К слову, очень удобным оказался и неприхотливым wget. Как привык к нему - не могу нарадоваться. Даже гуй под него не хотелось искать. Ещё заметил, что uptime моей системы составляет 18 дней, и это рекорд. Во времена юзания форточек эти форточки падали и скрипели уже через неделю. Даже вин7.
Вобщем, с таким вот печальным результатом я пришёл в универ, и рассказал всем о своей неудаче. И во время этих рассказов мне закралась в голову мысль, что линукс то у меня установлен 64-хбитный. А СПАД прогился на 32-хбитной платформе. Вот что значит чуточку поговорить с однокурсниками. А ведь я почти не разговаривал ни с кем всю неделю, и возможно если бы я сделал это раньше, то эта мысль пришла бы мне в сохранившуюся от перегрева извилину чуть быстрей.
В тот же день пришлось решать проблему с установкой VirtualBox на openSUSE с пересборкой ядра, что не мог сделать на протяжении полумесяца. В нём создал машину убунты 32-хбитной. Поставил её. Расшарил папочку с проектом, смонтировал в дочерней оси, запустил. Собирай компиляй, собирай компиляй. Запускай, проверяй. И о чудо! Возвращается результат, который ожидается! Ощущение сродни тому, как долго хотел полить огород соседа, и наконец добежав до него, глядя в небо, расслабляешься и чувствуешь себя счастливым.
Впоследствии оказалось, что всё равно не всё работает так как нужно, но судя по всему это из-за тех жостких (void*&) &this, которые я вроде как "поправил". Так что, буду разбираться, ведь осталась ещё неделя до сдачи программного продукта на проверку.
А читателю желаю быть проницательней, побольше гуглить и читать спецификаций и мануалов. И продуктивных ночей