Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1321 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  cross compilation C++ et wrapper C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

cross compilation C++ et wrapper C++

n°1922960
greenzephy​r
Posté le 10-09-2009 à 15:00:25  profilanswer
 

Salut,
 
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 :
  1. #ifndef TUX_H
  2. #define TUX_H
  3. #define DLL_EXPORT __declspec(dllexport)
  4. extern "C"{
  5. class DLL_EXPORT Tux
  6.      {
  7.       private:
  8.    const char* NAME;
  9.       public:
  10.    Tux(void){NAME="Racer";}
  11.    const char* __stdcall getName();
  12.      };
  13. }
  14. #endif //TUX_H


 
Je compile avec mingw32 sous linux:

Code :
  1. i586-mingw32msvc-g++ -Wall -shared tux.cc -o tux.dll -Wl,--output-def,tux.def


 
Je passe sous Windows...
Je crée la lib :

Code :
  1. lib /def:tux.def


 
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 :
  1. #include "stdafx.h"
  2. #include "tux.h"
  3. #pragma comment (lib, "./tux.lib" )
  4. #include <msclr\auto_handle.h>
  5. #pragma once
  6. public ref class TuxWrapper
  7. {
  8. private:
  9.  Tux *m_pTux;
  10. public:
  11.                 TuxWrapper();
  12.                 ~TuxWrapper();
  13.                 System::String^ getName();
  14. };


 
Ca compile mais au linkage ... crash :


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


 
 
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.

mood
Publicité
Posté le 10-09-2009 à 15:00:25  profilanswer
 

n°1923172
BenO
Profil: Chercheur
Posté le 11-09-2009 à 08:31:50  profilanswer
 

ton repertoire de debug fait partie des chemins de recherches des .lib ?


---------------
Python Python Python
n°1923179
greenzephy​r
Posté le 11-09-2009 à 08:53:17  profilanswer
 

BenO a écrit :

ton repertoire de debug fait partie des chemins de recherches des .lib ?


 
Ben, avec un autre projet fait sous VC++, il suffit que je copie la dll et la lib dans le répertoire de sortie et ca roule (j'avoue j'ai pas encore cherché dans visual studio où je devais indiquer le répertoire des dll et libs  :o  
 
Tu crois que ca vient juste de ca ? Car, avec un projet full VS (i.e. Tux.dll fait sous VS) ca marche. Avec Tux.dll fait sous mingw32-g++/Linux, ca marche plus  :pt1cable:  
 
merci du coup de main

n°1923181
BenO
Profil: Chercheur
Posté le 11-09-2009 à 08:56:58  profilanswer
 

Il est juste en train de dire qu'il ne trouve pas le binaire correspondant à ton Tux.cpp : tux.lib
 
Bouton droit sur ton projet dans VS > Properties > Linker > Input > première ligne.
 
voila :o


---------------
Python Python Python
n°1923186
greenzephy​r
Posté le 11-09-2009 à 09:14:59  profilanswer
 

BenO a écrit :

Il est juste en train de dire qu'il ne trouve pas le binaire correspondant à ton Tux.cpp : tux.lib
 
Bouton droit sur ton projet dans VS > Properties > Linker > Input > première ligne.
 
voila :o


 
ok. J'ai mis ma lib à côté de mes sources et inclut la macro $(intputdir) dans les propriétés de linkage du projet. (bon on fera plus joli en production).
Mais il doit y a voir encore un chemin à la cxx qui cloche:
 

Code :
  1. Error 1 fatal error LNK1104: cannot open file '........\TestDllImport\WrappingUx\.obj' WrappingUx WrappingUx


 
Les .obj ils sont générés dans le répertoire Debug, non ?    
Encore une propriété à changer ?
 
merci de votre aide car la je déprime (importer une simple classe, et je galère ...)

n°1923187
BenO
Profil: Chercheur
Posté le 11-09-2009 à 09:20:10  profilanswer
 

je sais plus :o


---------------
Python Python Python
n°1923190
greenzephy​r
Posté le 11-09-2009 à 10:04:35  profilanswer
 

BenO a écrit :

je sais plus :o


Mince :(
 
Sinon, le tux.h et ma méthode employée semblent-ils corrects ?
Une alternative ?
 
Bon, faut quand meme que je trouve ce que signifie cette erreur ... pourquoi il me cherche un .obj dans le inputdir...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  cross compilation C++ et wrapper C++

 

Sujets relatifs
[Résolu]pb compilation operator ++[XML] probleme de compilation dans libxml2
Programation en C[C#]Cherche idée de programme, sondage
Encoder une URL en CSharp C#[C++] Probleme de Makefile/linkage
Linux / Cross Compiling[Résolut]liaison Ada avec un .o C
[VBA] erreur de compilation procédure trop grande[C++] Cherche lib + howto pour utiliser le pilote wifi (linux)
Plus de sujets relatifs à : cross compilation C++ et wrapper C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR