2012-02-17 5 views
1

Je travaille sur un projet C++ où j'ai beaucoup de fichiers de projets générés par Visual Studio que je veux porter sur Linux. J'utilise essentiellement Windows.h fichier d'en-tête dans plusieurs fichiers sur Windows. Maintenant, je ne suis pas sûr car il n'existe pas explicitement de fichier linux.h (au cas où il le ferait, s'il vous plaît guide moi où regarder). Sur Linux, j'utilise Eclipse CDT pour le développement. J'ai deux idées à l'esprit de la façon dont cela fonctionnerait sur Linux mais je veux que votre entrée sache quelle est la bonne direction:portage du code win32 (windows.h) sur linux

(1) Pour supprimer les appels d'API Windows avec les appels d'API Linux dans les fichiers C++. Mais cela signifierait, je dois trouver une fonction équivalente dans Linux que je ne suis pas sûr de savoir où regarder. par exemple. Filetime dans Win32 est équivalent à quelque chose dans Linux (n'ont pas encore trouvé cette chose).

(2) Je copie la syntaxe de base de ces fonctions (comme écrit dans windows.h) et crée simplement un fichier d'en-tête (disons je le nomme linux.h) et inclue ce fichier d'en-tête dans projet sur linux. Donc, apparemment, vous avez peut-être compris que je suis confus sur la façon de faire avancer les choses. Je veux juste travailler cette chose. Veuillez me suggérer des idées/vues autres que les suivantes: (1) Non, je ne veux pas utiliser Boost. (2) Je ne veux pas réécrire les fichiers dans Visual Studio.

+6

"* Non, je ne veux pas utiliser Boost. *" Lol, amusez-vous. – ildjarn

+2

* Je ne veux pas réécrire les fichiers dans Visual Studio. * - Alors, comment allez-vous le porter? –

+0

Dans l'option (2), vous devez toujours écrire l'implémentation de toutes les fonctions dans les fichiers d'en-tête de Windows, n'est-ce pas? Donc, il n'y a pas vraiment de différence avec l'option (1). –

Répondre

1

Cela dépend vraiment de votre application. Si c'est une ligne de commande d'application non-gui seulement. Vous devriez chercher à remplacer vos appels win32 par des versions posix des fonctions compatibles avec différentes plates-formes (linux, Mac OS X).

Donc c'est l'option 1. Vous pouvez convertir Filetime en posix here et l'envelopper avec votre propre fonction qui a un #ifdef pour chaque OS sur lequel vous voulez compiler.

Options 2 est une douleur, été fait cela. Mais cela peut toujours être une option, cela dépend vraiment du nombre de fonctions Win32 que vous avez dans votre code source et de leur différence par rapport à la version posix. Je ne recommande pas cette option.

L'option 1 est meilleure une fois que vous avez appris les versions posix des fonctions win32 et que vous arrêtez d'utiliser la fonction win32 autant que possible.

+0

Merci beaucoup! Effacé mes doutes tout de suite! – user1167760

4

Linux implémente le POSIX API. Si vous suivez le chemin (1), vous devrez trouver les en-têtes et les appels d'ici.

Vous pouvez également utiliser Winelib pour essayer de compiler votre code Windows "nativement" sous Linux. Le Wine Project implémente une grande partie de l'API Windows, donc cela pourrait fonctionner, et il est théoriquement possible de recompiler votre programme Windows pour qu'il fonctionne sur Linux pour ARM, par exemple, mais ils ne donnent aucune garantie à ce sujet. Cependant, si vous voulez suivre ce second chemin, vous devrez recompiler chaque version de Wine que vos utilisateurs ont installée, donc s'ils sont sur x86, il est plus logique de leur donner le binaire avec un custom wine prefix configuré pour un état connu pour fonctionner. Une troisième alternative consiste à supprimer tout cela et à réécrire à l'aide d'un kit d'outils tel que Qt qui effectuera une compilation croisée sur Windows/Mac/Linux et déposera les appels directs sur le système d'exploitation sous-jacent. Si vous trouvez que votre code a souvent besoin de fonctionner sur différents systèmes d'exploitation, c'est probablement le meilleur choix.

+0

Merci beaucoup! C'était ce que je cherchais. – user1167760

4

Il semble que vous vouliez les API Windows sur Linux. Je pense que vous devriez également envisager de rendre votre code C++ portable en remplaçant les appels API Windows avec des bibliothèques portables comme STL et Boost. Mais, si vous ne pouvez vraiment pas faire cela, regardez WineHQ, qui est une implémentation des API Windows sous Linux.

+0

Merci pour la réponse! – user1167760

Questions connexes