IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Pb de cross compilation


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 107
    Par défaut Pb de cross compilation
    Salut,

    Avant tout je tiens à m'excuser si vous trouver que le sujet n'a pas sa place dans cette catégorie "Programmation Linux" mais vu que je fais de la cross compilation, ca concerne à la fois linux et à la fois windows ... donc fallait trancher...

    Je dispose de sources C++ que je devrai compiler sous Linux pour au final être utiliser sous windows (C#). Aille ! Aille ! Aille !
    Je tente donc quelques essais mais en vain pour l'instant...

    Mon fichier tux.h (je ne mets pas les cpp qui sont sans intérêt) sous Linux est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #ifndef TUX_H
    #define TUX_H
    #define DLL_EXPORT __declspec(dllexport)
     
    extern "C"{
    	class DLL_EXPORT Tux
         {
          private:
    		  const char* NAME;
          public:
    		  Tux(void){NAME="Racer";}
    		  const char* __stdcall getName();
         };
     }
     #endif //TUX_H
    Je compile avec mingw32 sous linux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i586-mingw32msvc-g++ -Wall -shared tux.cc -o tux.dll -Wl,--output-def,tux.def
    Je passe sous Windows...
    Je crée la lib :
    [cpp]lib /def:tux.def[/cpp]

    Je crée mon projet VSC++ (CLR pour pouvoir plus tard appeler ma classe depuis C#).
    J'inclus mon tux.h, je mets tux.dll et tux.lib dans le répertoire de debug.
    J'écris mon wrapper WrappingUx.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #include "stdafx.h"
    #include "tux.h"
    #pragma comment (lib, "./tux.lib") 
    #include <msclr\auto_handle.h> 
    #pragma once
     
    public ref class TuxWrapper
    	{
     
    	private:
    		Tux *m_pTux;
    	public:
                    TuxWrapper();
                    ~TuxWrapper();
                    System::String^ getName();
    	};
    Ca compile mais au linkage ... crash :[fixed]
    Error 1 error LNK2028: unresolved token (0A00000D) "public: char const * __stdcall Tux::getName(void)" (?getName@Tux@@$$FQAGPBDXZ) referenced in function "public: class System::String ^ __clrcall TuxWrapper::getName(void)" (?getName@TuxWrapper@@$$FQ$AAMP$AAVString@System@@XZ) WrappingUx.obj WrappingUx
    Error 2 error LNK2019: unresolved external symbol "public: char const * __stdcall Tux::getName(void)" (?getName@Tux@@$$FQAGPBDXZ) referenced in function "public: class System::String ^ __clrcall TuxWrapper::getName(void)" (?getName@TuxWrapper@@$$FQ$AAMP$AAVString@System@@XZ) WrappingUx.obj WrappingUx
    Error 3 fatal error LNK1120: 2 unresolved externals C:\Work\Leny\CPP\Tests\CrossCompilation\C#\TestDllImport\Debug\WrappingUx.dll WrappingUx[/fixed]


    Et là, je sèche carrément.
    J'ai essayé de jouer avec les extern, __stdcall, dllexport, .... rien à faire

    Quelqu'un aurait-il une idée du problème ?
    Une alternative ?
    Une info qui pourrait m'être utile?

    Merci d'avance pour votre aide.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Je vais surement dire un tas de bêtises car je ne sais pas faire ce que vous demander.
    Par contre, ce que je ne comprend pas, c'est que le code C ( linux ) renvoie un const char* alors que le code C# ( windows ) lui prendrait ( pour je crois la même fonction ) un String.

    Il me semble que c'est incohérent.

    Et quelqu'un peut me rappeler pourquoi on met un '^' pour la String ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 107
    Par défaut
    En fait, le code C++ (compilé sous Linux/G++/mingw32) retourne en effet du char* (c'est du C++ standard).

    Ensuite, je cherche à faire un Wrapper C++ en C++ managé (CLI) sous VisualStudio. Le C++ managé permet de créer des dll que tu pourras directement utiliser dans le code C#, ce qui n'est pas le cas des dll natives C++ (il faudrait passer par des dllimport sur chaque méthode que tu veux utiliser et en plus je sais pas comment on peut gérer des classes entières).
    Donc le wrapper C++ CLI est "managé". VS se charge de la mémoire, du GC, etc. Il fournit le type String^ et les "outils" pour passer de char* vers String^ et inversement.

    Enfin, dans le code C#, tu peux donc utiliser ta dll C++/CLI et faire des appels à ta classe, à tes méthodes. Une méthode C++/CLI qui retourne un String^, tu l"utilise dans le code C#*comme un méthode retournant un String. Aucune différence.

    Voili voilou.

    En attendant, j'ai pas encore réussi à utiliser mon code compilé sous Linux dans mon projet C#

    (alors que j'ai déjà fait le même genre de travail, mais la dll C++ native avait été faite sous Visual Studio... là est toute la différence ...).

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/12/2008, 02h01
  2. gcj pour cross compiler pour PPC
    Par obelix dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2006, 09h38
  3. Cross-compil pour MAC
    Par Ulmo dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 29/09/2006, 19h49
  4. Cross compil "ntohs"
    Par youte dans le forum Linux
    Réponses: 5
    Dernier message: 21/06/2006, 09h28
  5. cross compilation
    Par jowy dans le forum C++Builder
    Réponses: 11
    Dernier message: 26/08/2005, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo