cross compilation C++ et wrapper C++

cross compilation C++ et wrapper C++ - C++ - Programmation

Marsh Posté le 10-09-2009 à 15:00:25    

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.

Reply

Marsh Posté le 10-09-2009 à 15:00:25   

Reply

Marsh Posté le 11-09-2009 à 08:31:50    

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


---------------
Python Python Python
Reply

Marsh Posté le 11-09-2009 à 08:53:17    

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

Reply

Marsh Posté le 11-09-2009 à 08:56:58    

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
Reply

Marsh Posté le 11-09-2009 à 09:14:59    

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 ...)

Reply

Marsh Posté le 11-09-2009 à 09:20:10    

je sais plus :o


---------------
Python Python Python
Reply

Marsh Posté le 11-09-2009 à 10:04:35    

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...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed