Transferarea programelor de la ferestre la unix Partea 1

Clarificarea programelor procesului de portare pe C / C ++ de la Windows la UNIX

Programele sunt adesea concepute pentru a funcționa într-un mediu complet diferit de cel care angajează programator sau dezvoltator. Procesul de adaptare a programului de a lucra într-un mediu diferit se numește portare. Există mai multe motive pentru care ar putea avea nevoie să port de program. Posibil, utilizatorii finali doresc să utilizeze programul într-un mediu nou, cum ar fi în celelalte versiuni de UNIX® sau dezvoltatorii integrați propriul lor cod în software-ul pentru a optimiza pentru platforma, este utilizată în organizația dumneavoastră.

Rahul Kardam. un dezvoltator de software de conducere, Synapti Computer Aided design Pvt Ltd

Rahul Kardam (Rahul Kardam) - un software dezvoltator de conducere specializat în instrumente de automatizare de proiectare electronice avansate construite în C ++, cum ar fi obiecte tehnice de modelare sisteme. El are o experiență de programare sub platformele Windows și UNIX. Rahul se bucură de software editări cu software-ul open source, pe care îl folosește ca bază pentru dezvoltarea unor instrumente durabile și scalabile de automatizare cod de proiectare, pe care el lucrează.

Migrarea de la Windows la UNIX

Tipuri de C / C ++ proiecte în Visual Studio

Când Visual C ++, puteți crea unul dintre următoarele tipuri de proiecte (singur sau multi-threaded)

  • legat în mod dinamic bibliotecă (DLL sau .dll);
  • biblioteca statica (LIB sau .lib);
  • fișier executabil (.exe).

Pentru mai multe tipuri de proiecte complexe, folosind Visual Studio .NET produs - cu ajutorul acestei soluții, puteți crea și procesa o varietate de proiecte. Următoarele două secțiuni ale acestui document dedicat portare bibliotecii dinamice și statice de la Windows la UNIX.

DLL portarea un mediu UNIX

biblioteci .dll echivalente în UNIX este un obiect partajat (.so), dar procesul de creare a unui fișier .so este semnificativ diferit de la crearea fișierului .dll. Listarea 1 prezintă un exemplu de creare a unei biblioteci .dll mici, care conține funcția unică printHello. numit de principalele comenzi de fișiere main.cpp.

Listarea 2 arată hello.cpp codul sursă.

Listarea hello.cpp 2. Fișier

Dacă utilizați un standard de 32 de biți compilator C / C ++ Microsoft pentru 80x86 platforme (CL), următoarea comandă va fi utilizat pentru a crea fișierul hello.dll:

Parametru / LD instruiește compilatorul pentru a crea un fișier .dll cl. Se poate indica, de asemenea, la crearea de alte formate, cum ar fi exe sau .obj. puncte Parametru / DBUILDING_DLL utilizat pentru această compilație PRINT_API macro, astfel printHello ID-ul exportate din DLL.

Listarea 3 arată codul sursă al fișierului main.cpp folosind comanda printHello. Se înțelege că hello.h, main.cpp hello.cpp și sunt în același folder.

Listarea 3. Codul sursă pentru fișierul principal, utilizați comanda printHello

Pentru a compila și link-ul de cod de fișiere principal, utilizați următoarea comandă:

O trecere în revistă sumară a codului sursă și producția rezultată la dosar relevă două fapte importante. În primul rând: sintaxa specifică pentru Windows __declspec (dllexport) este necesar pentru toate exporturile din funcțiile DLL, variabile sau clase. Și, în al doilea rând, compilarea generează două fișiere - printHello.dll și printHello.lib. PrintHello.lib folosit pentru a lega sursa principală și UNIX codul de fișier antet pentru obiecte partajate și nu necesită declspec sintaxă. Rezultatul unei compilații de succes este un singur fișier asociat cu .so fișierul principal de cod sursă.

Listarea 4. antet modificat pentru hello.h cu modificări pentru UNIX

Pentru a lega biblioteca hello.so partajate, folosiți următoarea comandă:

Pentru a crea fișierul executabil principal, compila codul sursă:

Ascunde ID în g ++

Există două modalități principale de a exporta identificatorilor de la bibliotecile DLL OC Windows. Prima metodă este de a utiliza __declspec (dllexport) numai elemente specifice (de exemplu, clase, variabile globale sau funcții globale) exportate din DLL. A doua metodă este de a utiliza un fișier de definire a modulului (.def). Def-fișier are propria sintaxă și conține o listă de identificatori, care trebuie să fie exportate din DLL.

Listarea 5. identificatorii Ascunderea în g ++

Mecanismul de atribut Prezentare generală în g ++

La fel ca mediul Visual Studio, care suportă diverse sintaxa suplimentare peste C / C ++. g ++ suporta multe non-standard, extensii de limbaj C este una dintre ele - este mecanismul g ++ atribute. utilizate pentru portare. În exemplul anterior am considerat identificatorii ascuns. De asemenea, este utilizat pentru a defini atributele tipurilor de funcții, cum ar fi cdecl. stdcall și fastcall în Visual C ++. În al doilea articol din acest mecanism atribut serie este discutat mai detaliat.

DLL încărcare Explicit sau obiect partajat pe UNIX

Luați în considerare cazul exemplului anterior. Listarea 6 arată fișierul antet loadlib.h utilizat sursă, care determină metoda principală.

Listarea 6. loadlib.h fișier header

Acum, principala metodă încarcă în mod explicit fișierul printHello.dll și solicită metoda de imprimare. așa cum se arată în exemplul 7.

Listarea 7. Loadlib.cpp fișierul principal

DLL calea de căutare în medii Windows și UNIX

În Windows căutare bibliotecă DLL se desfășoară în ordinea următoare.

  1. Directorul în care fișierul executabil (de exemplu, notepad.exe în Windows).
  2. Directorul curent de lucru (directorul din care rulați notepad.exe).
  3. directorul de sistem Windows (de obicei C: \ Windows \ System32).
  4. Catalog de Windows (de obicei C: \ Windows).
  5. Directoare enumerate în setările de variabila de mediu PATH.

In sistemele de operare bazate pe UNIX, cum ar fi Solaris, ordinea de căutare definește mediul LD_LIBRARY_PATH variabilă bibliotecă partajată. Calea către noua bibliotecă partajată trebuie să fie adăugate la variabila LD_LIBRARY_PATH. Sistemul de operare HP-UX sunt căutate în directoarele specificate de variabile SHLIB_PATH, și apoi la LD_LIBRARY_PATH. IBM AIX® ordinea de căutare a sistemului de operare specifică LIBPATH variabilă de bibliotecă partajată.

Portarea o bibliotecă statică de la Windows la UNIX

Statice biblioteci de cod obiect, în contrast cu bibliotecile de legături dinamice, conectat pentru a compila aplicații și să devină, astfel, o parte din ea. În sistemele UNIX, biblioteci statice sunt denumite în conformitate cu acordul, în conformitate cu care se adaugă numele lor la lib prefix și extensia .a. De exemplu, biblioteca Windows user.lib la UNIX, de regulă, va fi numit libuser.a. Pentru a crea o bibliotecă statică conține un sistem de operare încorporat comenzi și ar ranlib. Listarea 8 arată cum să creați o bibliotecă libuser.a statică a fișierelor sursă și user_log1.cpp user_sqrt1.cpp.

Listarea 8. Crearea unei biblioteci statice într-un mediu UNIX

comandă ar creează o libuser.a bibliotecă statică și pune-l user_sqrt1.o user_log1.o și fișierele obiect. În cazul în care există deja în bibliotecă, fișierele obiect sunt adăugate la acesta. Dacă fișierele obiect sunt mai noi decât cele utilizate în bibliotecă, fișierul vechi va fi suprascrisă. Opțiunea r instruiește compilatorul pentru a înlocui fișierele obiect vechi din bibliotecă cu noi versiuni ale aceleași fișiere. În cazul în care biblioteca nu există, se creează un nou parametru c.

După crearea arhivei, sau să modificați unul existent, trebuie să creați un index de conținut și salvați-l ca parte a fișierului. Indicele listează toate simbolurile definite de conținut arhivă, care este un fișier obiect mobil. Indicele accelerează care face legătura cu o bibliotecă statică și vă permite să apelați fluxurile de bibliotecă, indiferent de locația lor specifică în bibliotecă. Rețineți că GNU ar ranlib este un agent de prelungire. și-l numesc, cu un argument al lui [ar] -s duce la același rezultat ca și ranlib de start.

antete precompiled

Aplicație C / C ++ în Visual C ++ folosesc adesea antete precompilate. antete Precompilarea crește performanța unor compilatoare, cum ar fi cl. pentru a accelera compilarea. aplicatii complexe folosesc adesea fișierele header (.h sau .hpp), care sunt fragmente de cod care sunt incluse ca parte a unuia sau mai multor fișiere sursă. Fișierele antet de proiect schimba rar. Prin urmare, pentru a accelera compilarea acestor fișiere pot fi convertite într-o formă intermediară, care este mai ușor pentru compilări ulterioare. În mediul Visual Studio, această formă intermediară numită fișiere antet precompilate (fișiere antet precompilate, PCH).

De exemplu, ia în considerare fișier hello.cpp de mai sus, în listele de 1 și 2. Pornirea iostream și definiție EXPORT_API macro poate fi considerată ca utilizarea de fragmente din același cod, în cadrul proiectului. Astfel, ele sunt un bun exemplu pentru a fi incluse în fișierul antet. Listarea 9 arată modificările codului de necesare.

Listarea 9. precomp.h Conținut

Listarea 10 arată codul sursă pentru DLL mutandis.

Listarea 10. Conținutul noului hello.cpp fișier

Așa cum sugerează și numele lor, fișierele precompilată antete conțin cod obiect compilat care este inclus înainte de punctul de finalizare antet (oprire antet). Acest punct în codul sursă este marcată de obicei de token-ul nu este utilizat de preprocesor, indicând astfel că acesta nu este un preprocesor de comandă. De asemenea, punctul de finalizare antet poate fi desemnat ca #pragma hdrstop. în cazul în care se află în codul sursă, înainte de cuvântul cheie validă nu este procesat de către preprocesor.

Când compilarea sistemului de operare Solaris includ fișiere precompilate antet indică comanda #include. După ce a descoperit această echipă pentru fișierul inclus, căutările compilator pentru un antet precompilate în toate directoarele, începând cu directorul în care fișierul în sine. O căutare pentru numele specificat în #include comandă. cu extinderea .gch. Dacă antetul precompilata nu poate fi utilizat, acesta este ignorat.

Aici este comanda de a utiliza antete precompilate pe Windows:

Parametru / Yc spune cl compilator crea un antet precompilata din fișierul precomp.h. Același lucru se realizează în sistemul de operare Solaris cu următoarea comandă:

Prima comandă creează precomp.h.gch antet precompiled. Rezultatul creării unui obiect partajat este același cu cel descris mai sus.

Notă. Suport pentru anteturi precompilate în g ++ este disponibil pentru versiunile 3.4 și mai sus.

concluzie

Portarea programe între cele două sisteme de operare în mod semnificativ diferite, cum ar fi Windows și UNIX, acesta nu a fost niciodată o sarcină ușoară și a necesitat o serie de ajustări și răbdare. Acest articol discută despre elementele de bază ale portare proiecte tipice din mediul Visual Studio în g ++ care rulează sistemul de operare Solaris. În al doilea și ultimul articol din această serie au discutat mai multe opțiuni de compilator, care sunt disponibile în Visual Studio, și echivalentele lor în g ++. atribut mecanism g ++. unele aspecte ale aplicațiilor de portare de la mediul pe 32 de biți (de obicei Windows) pentru un mediu pe 64 de biți (UNIX), și multi-threading.

  • Articolul original: Windows pentru UNIX portare, Partea 1: Portarea C / C ++ surse (EN).
  • Microsoft Developer Network (EN): Acest site conține documentație despre funcțiile bibliotecilor dinamice link.
  • Crearea unui module care pot fi descărcate C ++ (EN): Frank Pilhofer (Frank Pilhofer) analizează în detaliu subiectul.
  • Crearea și utilizarea de biblioteci statice partajate și C (EN): Citiți acest manual pe un site mic de un mic grup de programatori Unix (LUPG).
  • Ghidul utilizatorului DMI C ++ (EN): Consultați acest ghid pentru o descriere detaliată a antetele pre-compilate.
  • documentația online pentru GCC (EN): acest site conține un ghid pentru cele mai recente versiuni ale GCC / G ++.
  • AIX și UNIX (EN): AIX și UNIX pe developerWorks oferă o multitudine de informații cu privire la toate aspectele legate de AIX și UNIX administrarea sistemului subtilități sisteme.
  • AIX și UNIX știri. vă rugăm să vizitați "News AIX și UNIX" pentru a afla mai multe despre AIX și UNIX. (EN)
  • AIX Wiki. mediu colaborativ de informații tehnice referitoare la AIX. (EN)
  • „Evenimente tehnice și emisiuni bazate pe Web pe developerWorks va ajuta să rămâneți la curent cu știrile. (RO)
  • Podcasts IBM. regla și a obține materiale de la experții tehnici IBM. (RO)

Obțineți produse și tehnologii

  • Construiți-vă proiect de dezvoltare viitoare cu software-ul de încercare IBM. (EN)