Прехвърляне на програми от прозорците на UNIX Част 1
Изясняването на програмите на процеса пренасяне на C / C ++ от Windows към UNIX
програми често са проектирани да работят в среда, напълно различна от тази, в която работят програмист или разработчик. Процесът на адаптиране на програмата за работа в различна среда се нарича пренасяне. Има няколко причини, поради които може да се нуждаят от до пристанището на програмата. Възможност за крайните потребители, които искате да използвате програмата в нова среда, като в другите версии на UNIX® или разработчиците интегрира собствените си код в софтуера, за да го оптимизираме за платформата, се използва във вашата организация.
Рахул Кардам. водещ разработчик на софтуер, Synapti Компютърно проектиране Pvt Ltd
Рахул Кардам (Rahul Кардам) - водещ разработчик на софтуер, специализирана в усъвършенствани инструменти електронна автоматизация, построени в C ++, като например системи за моделиране на технически обекти. Той има опит в програмирането под Windows и UNIX платформи. Раул се радва на редакциите на софтуер с отворен код, който той използва като основа за развитието на устойчиви и мащабируеми инструменти код автоматизация на проектирането, на която той работи.
Миграция от Windows към UNIX
Типове C / C ++ проекти в Visual Studio
Когато Visual C ++, можете да създадете един от следните видове проекти (единичен или многонишковите)
- динамично свързана библиотека (DLL или .dll);
- статично библиотека (LIB или .lib);
- изпълним файл (.exe).
За по-сложни видове проекти, които използват Visual Studio .NET продукт - с помощта на това решение, можете да създадете и да обработва различни проекти. Следващите две части на този документ, посветени на пренасяне на динамични и статични библиотека от Windows към UNIX.
DLL пренасяне на UNIX среда
Равностойни .dll библиотеки в UNIX е споделен обект (Така че), но процесът на създаване на файла Така че значително се различава от създаването .dll файл. Обява 1 показва пример за създаване на малък .dll библиотека, която съдържа една функция printHello. наречен от основните main.cpp файлови команди.
Обява 2 показва код hello.cpp на.
Обява 2. File hello.cpp
Ако се използва стандартен 32-битов компилатор C / C ++ Microsoft за 80x86 платформи (CL), следната команда ще бъдат използвани за създаване hello.dll файл:
Параметър / LD инструктира компилатора за създаване на .dll файл сантилитра. Също така може да сочи към създаването на други формати като Търсейки или .obj. Параметър / DBUILDING_DLL точки, използвани за тази компилация макро PRINT_API така printHello ID изнасяни от тази DLL.
Обява 3 показва изходния код на main.cpp файл с помощта на командата printHello. Разбираемо е, че hello.h, hello.cpp main.cpp и са в една и съща папка.
Обява 3. изходния код на основния файл, използвайте командата printHello
За да компилирате и да свърже главния файл код, използвайте следната команда:
Един бегъл преглед на изходния код и получената продукция до файла разкрива две важни факти. Първо: Не се изисква специфична синтаксис Windows __declspec (dllexport) за всички износ от DLL функции, променливи или класове. И второ, съставяне генерира два файла - printHello.dll и printHello.lib. PrintHello.lib, използвана за свързване основният източник и UNIX файл заглавието код за споделени обекти и не изисква синтаксис declspec. В резултат на успешната компилация е един-единствен файл Така че, свързан с главния сорс.
Обявата 4. Променено глава за hello.h с промени за UNIX
За да се обвърже сподели hello.so библиотека, използвайте следната команда:
За да създадете главния изпълним файл, съставяне на изходния код:
Hide ID в гр ++
Има два основни начина за износ на идентификатори от библиотеки DLL ОС Windows. Първият метод е да се използва __declspec (dllexport) само за определени елементи (например, класове, глобални променливи или глобални функции), изнесени от DLL. Вторият метод е да се използва файл с определения модул (.def). Def файл има свой синтаксис и съдържа списък с идентификатори, които трябва да бъдат изнесени от DLL.
Обявата 5. Скриване идентификатори в гр ++
Обща механизъм атрибут в гр ++
Подобно на Visual Studio среда, която подкрепя различни допълнителен синтаксис над C / C ++. гр ++ поддържа много нестандартни разширения на езика С е един от тях - това е механизъм, г ++ атрибути. се използва за пренасяне. В предишния пример, която представихме скривалища идентификатори. Освен това се използва за определяне на атрибутите на видове функции, като cdecl. stdcall и fastcall в Visual C ++. Във втората статия в този механизъм серия атрибут се обсъжда по-подробно.
Изрично натоварване DLL или споделен обект на UNIX
Да разгледаме случая на предишния пример. Обявата 6 показва loadlib.h заглавния файл се използва източник, което причинява основен метод.
Обява 6. loadlib.h на заглавния файл
Сега основният метод изрично зарежда printHello.dll файл и призовава метод за печат. както е показано в Пример 7.
Обява 7. Главна файл Loadlib.cpp
DLL пътя за търсене в Windows и UNIX среда
В Windows търсене DLL библиотека се провежда в следната последователност.
- Директорията, където изпълним файл (например, notepad.exe в Windows).
- текущата работна директория (директорията, от която тече notepad.exe).
- системната директория на Windows (обикновено C: \ Windows \ System32).
- Каталог на Windows (обикновено C: \ Windows).
- Директории, изброени в настройките на променливите от обкръжението.
В UNIX-базирани операционни системи, като Solaris, реда за търсене определя споделена библиотека променлива LD_LIBRARY_PATH околната среда. Пътят към новата споделената библиотека трябва да се добави променливата LD_LIBRARY_PATH. Операционната система HP-UX се търсят в директориите зададени от SHLIB_PATH променливи, а след това на LD_LIBRARY_PATH. IBM AIX® Заповедта за търсене операционна система определя споделена библиотека променлива LIBPATH.
Пренасянето статична библиотека от Windows към UNIX
Статичните библиотеки обектен код, за разлика от динамичните библиотеки връзка, свързан с компилирането на приложения, и по този начин да станат част от него. В UNIX системи, статични библиотеки са именувани според договора, според която името им се добавя към ИЪ префикс и .a разширение. Например, Windows user.lib библиотека за UNIX, като правило, ще се нарича libuser.a. За да създадете статични библиотека съдържа вградена операционна система команди ар и ranlib. Обява 8 показва как да създадете статична библиотека libuser.a на изходните файлове и user_sqrt1.cpp user_log1.cpp.
Обява 8. Създаване на статична библиотека в среда UNIX
ар команда създава статично библиотека libuser.a и го поставя user_sqrt1.o user_log1.o и обектно файлове. Ако вече съществува в библиотеката, се добавят обектни файлове към него. Ако вашите обектните файлове са по-нови от тези, използвани в библиотеката, старият файл ще бъде презаписан. опция р инструктира компилатора да заменят старите обект файловете в библиотеката с нови версии на едни и същи файлове. Ако библиотеката не съществува, тя създава нов параметър в.
След създаването на архива, или промяна на съществуващ такъв, трябва да създадете индекс на съдържание и да го запишете като част от файла. Индексът показва списък с всички символи, определени от архивно съдържание, което е движима вещ файл. Индексът ускорява свързването със статична библиотека и ви позволява да се обадя потоци от библиотеката, независимо от конкретното им местоположение в библиотеката. Имайте предвид, че GNU ар ranlib е разширение агент. и го наричат с аргумент на S [ар -s] води до същия резултат, както и началният ranlib.
прекомпилирани заглавията
Приложение C / C ++ в Visual C ++ често използват прекомпилирани заглавки. Предкомпилирането заглавията увеличава производителността на някои компилатори, като например т. за ускоряване на компилацията. Сложни приложения често използват заглавните файлове (.h или .hpp), които са фрагменти от код, които са включени като част от един или повече изходни файлове. заглавни файлове на проекта се променят рядко. Ето защо, за да се ускори събирането на тези файлове могат да бъдат превърнати в междинна форма, която е по-лесно за следващите компилации. В Visual Studio среда, тази междинна форма, наречена файлове предкомпилирана хедър (прекомпилирани заглавни файлове, PCH).
Помислете например за hello.cpp файл по-горе, в предложения от 1 и 2. Включване iostream и определение EXPORT_API макро може да се счита използването на фрагменти от същия код в рамките на проекта. По този начин, те са добър пример за включване в заглавната част на файла. Обява 9 показва необходимите промени код.
Обява 9. precomp.h съдържание
Обява 10 показва изходния код на DLL според случая.
Обява 10. Съдържанието на нов файл hello.cpp
Както подсказва името им, файлове предкомпилират заглавията съдържат съставен обект код, който е включен преди заглавна завършване точка (заглавна спирка) на. Тази точка в изходния код обикновено се отбелязва с означението не се използва от Препроцесорът, което показва, че това не е команда предпроцесорни. Също глава завършване точка може да бъде определен като #pragma hdrstop. ако тя се намира в изходния код преди валиден Ключовата дума не се обработва от Препроцесорът.
При съставяне на Solaris операционна система включват файлове предкомпилират заглавна показва командата #include. След като открил този отбор за включвания файл, търси компилатор за предварително компилирано с глава във всички директории, като се започне с директорията, в която самата преписка. Търсенето на името, посочено в командата #include. с разширяването на .gch. Ако не може да се използва компилиран заглавието, тя се пренебрегва.
Това е командата да използват прекомпилирани заглавията на Windows:
Параметър / Yc казва CL съставител създават компилиран с глава от precomp.h файл. Същото се извършва в Solaris операционна система със следната команда:
Първата команда създава компилиран с глава precomp.h.gch. В резултат на създаване на общо обект е същото, както е описано по-горе.
Забележка. Подкрепа за прекомпилирани заглавията в гр ++ е достъпно за версии 3.4 и по-горе.
заключение
Пренасянето програми между двете значително различни операционни системи като Windows и UNIX, то никога не е било лесна задача и изисква редица корекции и търпение. Тази статия разглежда основите на пренасяне типични проекти от Visual Studio среда в гр ++ управлението на Solaris OS. През втората и последна статия в тази серия обсъдени много опции на компилатора, които са налични в Visual Studio, както и техните еквиваленти в гр ++. атрибут механизъм г ++. някои аспекти на адаптирането на приложения от 32-битова среда (обикновено Windows) до 64-битова среда (UNIX) и многонишкова.
- Оригинална статия: Windows към UNIX пренасяне, Част 1: Пренасянето C / C ++ източници (EN).
- Microsoft Developer Network (EN): Този сайт съдържа документация за функциите на динамични библиотеки връзка.
- Създаване на сваляне C ++ модули (EN): Франк Pilhofer (Frank Pilhofer) подробно разглежда този въпрос.
- Създаване и използване на статични споделени библиотеки и C (EN): Прочетете това ръководство на малък сайт на една малка група от програмисти Unix (LUPG).
- Ръководство за потребителя KAI C ++ (EN): Обърнете се към това ръководство за подробно описание на предварително съставен заглавията.
- Онлайн документация за GCC (EN): Този сайт съдържа ръководство за най-новите версии на GCC / G ++.
- AIX и UNIX (EN): AIX и UNIX на developerWorks осигурява изобилие от информация, свързана с всички аспекти на AIX и UNIX система за администриране тънкостите системи.
- AIX и UNIX новини. моля посетете "Новини AIX и UNIX", за да научите повече за AIX и UNIX. (EN)
- AIX Wiki. среда за съвместна работа за техническа информация, свързана с AIX. (EN)
- "Технически събития и уеб-базирани предавания по developerWorks ще ви помогнат да бъдете в крак с новините. (EN)
- Подкастове IBM. коригира и да получите материали от IBM технически експерти. (EN)
Вземете продукти и технологии
- Изграждане на следващия си проект за развитие със софтуер на IBM процес. (EN)