Lenolian
15/04/2005, 13h03
J'essaye de porter la lib SxDL (j'ai la 2.4) sur la plateforme .Net et après quelques longues heures, j'arrive enfin à créer une application SxDL. C'est fou le nombre de SDK que j'ai du installer pour la faire tourner.
Après çà j'ai juste recompiler avec l'option /clr pour passer en environement managée. Bien évidemment ça marche pas correctement, j'ai une foultitude d'erreur dans des headers obscurs (ObjBase.h & Unknw.h) du type :
C:\Program Files\Microsoft Visual Studio 8\VC\include\ObjBase.h(398) : error C2146: syntax error : missing ';' before identifier 'IRpcStubBuffer'
C:\Program Files\Microsoft Visual Studio 8\VC\include\ObjBase.h(398) : error C2079: 'IRpcStubBuffer' uses undefined struct 'IRpcStubBuffer'
C:\Program Files\Microsoft Visual Studio 8\VC\include\ObjBase.h(399) : error C2146: syntax error : missing ';' before identifier 'IRpcChannelBuffer'
C:\Program Files\Microsoft Visual Studio 8\VC\include\ObjBase.h(399) : error C2371: 'IRpcChannelBuffer' : redefinition; different basic types
c:\Program Files\Microsoft Visual Studio 8\VC\include\RpcNdr.h(675) : see declaration of 'IRpcChannelBuffer'
J'ai remarquer qu'à chaque fois une ligne du type "typedef interface IXXX IXXX" était en cause. J'ai cru comprendre qu' interface n'était pas un mot-clé du C++ alors qu'il en est un en C++ managée, je pense que l'erreur vient de là, mais je vois pas trop comment résoudre le problème.
Seconde tentative avec l'option /clr:oldsyntax, cela oblige à utiliser les anciens mots-clé du C++ managée (ils ont complètement changé maintenant). Avec cette option de compilation je n'ai plus de problème avec les headers mais plutôt avec le linker :
------ Build started: Project: TestSxDL, Configuration: Debug Win32 ------
Compiling...
Test.cpp
Linking...
LibSxDL.lib(d3dapp.obj) : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _malloc already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _realloc already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _free already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __exit already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __cexit already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRT.lib(cinitexe.obj)
LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRT.lib(cinitexe.obj)
LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRT.lib(cinitexe.obj)
LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in MSVCRT.lib(cinitexe.obj)
LIBCMTD.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(errmode.obj) : error LNK2005: ___set_app_type already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0.obj) : error LNK2005: ___app_type already defined in MSVCMRT.lib(mstartup.obj)
LIBCMTD.lib(_file.obj) : error LNK2005: ___iob_func already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(fflush.obj) : error LNK2005: _fflush already defined in MSVCRT.lib(MSVCR80.dll)
Creating library Debug/TestSxDL.lib and object Debug/TestSxDL.exp
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library
LIBCMTD.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function _mainCRTStartup
Debug/TestSxDL.exe : fatal error LNK1120: 1 unresolved externals
Build log was saved at "file://d:\ManagedSxDL\TestSxDL\Debug\BuildLog.htm"
TestSxDL - 19 error(s), 3 warning(s)
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 1 skipped ==========
Je ne connais pas trop les options de compilateurs donc je ne sais pas trop comment résoudre ce nouveau problème.
Sinon pour la méthode, je vais créer une dll.Net en C++ managée qui fera la liaison entre la lib SxDL et les codes C#,VB et autres. C'est je pense la méthode la plus adapté, P/Invoke est trop lent pour avoir de bonnes perfs, et utiliser l'IJW n'autorise que le c++ managée comme langage.
En gros on utilise un pointeur sur la classe que l'on veut wrapper, dans une classe managée et on marshal les données si nécessaire. Ca donne un truc comme ça (en utilisant l'ancienne syntaxe) :
public __gc class ManagedSxDL
{
private :
SxDL __nogc *m_Ptr;
public :
ManagedSxDL() { m_Ptr = new SxDL(); }
virtual ~ManagedSxDL() { delete m_Ptr; }
}
Voilà pour la présentation. A force de coder en C#, j'en avais complètement oublier que le C++ est si "chiant". Faut toujours linker des nouvelles libs qui sont parfois dur à trouver (j'ai du installer le SDK internet de windows pour compiler SxDL !!)... Bref vive C# .
Après çà j'ai juste recompiler avec l'option /clr pour passer en environement managée. Bien évidemment ça marche pas correctement, j'ai une foultitude d'erreur dans des headers obscurs (ObjBase.h & Unknw.h) du type :
C:\Program Files\Microsoft Visual Studio 8\VC\include\ObjBase.h(398) : error C2146: syntax error : missing ';' before identifier 'IRpcStubBuffer'
C:\Program Files\Microsoft Visual Studio 8\VC\include\ObjBase.h(398) : error C2079: 'IRpcStubBuffer' uses undefined struct 'IRpcStubBuffer'
C:\Program Files\Microsoft Visual Studio 8\VC\include\ObjBase.h(399) : error C2146: syntax error : missing ';' before identifier 'IRpcChannelBuffer'
C:\Program Files\Microsoft Visual Studio 8\VC\include\ObjBase.h(399) : error C2371: 'IRpcChannelBuffer' : redefinition; different basic types
c:\Program Files\Microsoft Visual Studio 8\VC\include\RpcNdr.h(675) : see declaration of 'IRpcChannelBuffer'
J'ai remarquer qu'à chaque fois une ligne du type "typedef interface IXXX IXXX" était en cause. J'ai cru comprendre qu' interface n'était pas un mot-clé du C++ alors qu'il en est un en C++ managée, je pense que l'erreur vient de là, mais je vois pas trop comment résoudre le problème.
Seconde tentative avec l'option /clr:oldsyntax, cela oblige à utiliser les anciens mots-clé du C++ managée (ils ont complètement changé maintenant). Avec cette option de compilation je n'ai plus de problème avec les headers mais plutôt avec le linker :
------ Build started: Project: TestSxDL, Configuration: Debug Win32 ------
Compiling...
Test.cpp
Linking...
LibSxDL.lib(d3dapp.obj) : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _malloc already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _realloc already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(dbgheap.obj) : error LNK2005: _free already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __exit already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __cexit already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRT.lib(cinitexe.obj)
LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRT.lib(cinitexe.obj)
LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRT.lib(cinitexe.obj)
LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in MSVCRT.lib(cinitexe.obj)
LIBCMTD.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(errmode.obj) : error LNK2005: ___set_app_type already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(crt0.obj) : error LNK2005: ___app_type already defined in MSVCMRT.lib(mstartup.obj)
LIBCMTD.lib(_file.obj) : error LNK2005: ___iob_func already defined in MSVCRT.lib(MSVCR80.dll)
LIBCMTD.lib(fflush.obj) : error LNK2005: _fflush already defined in MSVCRT.lib(MSVCR80.dll)
Creating library Debug/TestSxDL.lib and object Debug/TestSxDL.exp
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library
LIBCMTD.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function _mainCRTStartup
Debug/TestSxDL.exe : fatal error LNK1120: 1 unresolved externals
Build log was saved at "file://d:\ManagedSxDL\TestSxDL\Debug\BuildLog.htm"
TestSxDL - 19 error(s), 3 warning(s)
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 1 skipped ==========
Je ne connais pas trop les options de compilateurs donc je ne sais pas trop comment résoudre ce nouveau problème.
Sinon pour la méthode, je vais créer une dll.Net en C++ managée qui fera la liaison entre la lib SxDL et les codes C#,VB et autres. C'est je pense la méthode la plus adapté, P/Invoke est trop lent pour avoir de bonnes perfs, et utiliser l'IJW n'autorise que le c++ managée comme langage.
En gros on utilise un pointeur sur la classe que l'on veut wrapper, dans une classe managée et on marshal les données si nécessaire. Ca donne un truc comme ça (en utilisant l'ancienne syntaxe) :
public __gc class ManagedSxDL
{
private :
SxDL __nogc *m_Ptr;
public :
ManagedSxDL() { m_Ptr = new SxDL(); }
virtual ~ManagedSxDL() { delete m_Ptr; }
}
Voilà pour la présentation. A force de coder en C#, j'en avais complètement oublier que le C++ est si "chiant". Faut toujours linker des nouvelles libs qui sont parfois dur à trouver (j'ai du installer le SDK internet de windows pour compiler SxDL !!)... Bref vive C# .