Dear Bertrand,
For testing purposes I have created libraries “MyClass.dll” and “libMyClassIOMT.dll” whereby library “MyClass.dll” uses class “MyClassIO” which
is defined in library “libMyClassIOMT.dll”.
class MyClassIO
{
private:
const char *fString;
public:
MyClassIO();
virtual ~MyClassIO();
virtual void ReadFileC(const char *infile);
virtual void ReadFileCpp(const char *infile);
virtual void WriteFileC(const char *outfile);
virtual void WriteFileCpp(const char *outfile);
virtual void ReadIFileStream(ifstream &input);
virtual void WriteOFileStream(ofstream &output);
};
The problem is that I need to create a module definition file for library “libMyClassIOMT.dll” so that library “MyClass.dll” can use class “MyClassIO”.
Since my efforts to create “libMyClassIOMT.def” manually failed I tried to use “dumpbin”, see: msdn.microsoft.com/en-us/library/20y05bd5.aspx
dumpbin /EXPORTS /OUT:tmp.txt libMyClassIOMT.lib
Thus my final module definition file “libMyClassIOMT.def” looks as follows:
LIBRARY libMyClassIOMT
EXPORTS
??0MyClassIO@@QAE@ABV0@@Z (public: __thiscall MyClassIO::MyClassIO(class MyClassIO const &))
??0MyClassIO@@QAE@XZ (public: __thiscall MyClassIO::MyClassIO(void))
??1MyClassIO@@UAE@XZ (public: virtual __thiscall MyClassIO::~MyClassIO(void))
??4MyClassIO@@QAEAAV0@ABV0@@Z (public: class MyClassIO & __thiscall MyClassIO::operator=(class MyClassIO const &))
??_7MyClassIO@@6B@ (const MyClassIO::`vftable')
?ReadFileC@MyClassIO@@UAEXPBD@Z (public: virtual void __thiscall MyClassIO::ReadFileC(char const *))
?ReadFileCpp@MyClassIO@@UAEXPBD@Z (public: virtual void __thiscall MyClassIO::ReadFileCpp(char const *))
?ReadIFileStream@MyClassIO@@UAEXAAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@Z (public: virtual void __thiscall MyClassIO::ReadIFileStream(class std::basic_ifstream<char,struct std::char_traits<char> > &))
?WriteFileC@MyClassIO@@UAEXPBD@Z (public: virtual void __thiscall MyClassIO::WriteFileC(char const *))
?WriteFileCpp@MyClassIO@@UAEXPBD@Z (public: virtual void __thiscall MyClassIO::WriteFileCpp(char const *))
?WriteOFileStream@MyClassIO@@UAEXAAV?$basic_ofstream@DU?$char_traits@D@std@@@std@@@Z (public: virtual void __thiscall MyClassIO::WriteOFileStream(class std::basic_ofstream<char,struct std::char_traits<char> > &))
Sadly using this module definition file with the linker results in the following error:
"C:\Programme\Microsoft Visual Studio 9.0\VC\bin/link" /dll /def:libMyClassIOMT.def /out:libMyClassIOMT.dll fp10.obj *.obj
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
libMyClassIOMT.def(3) : fatal error LNK1118: syntax error in '(public:' statement
NMAKE : fatal error U1077: '"C:\Programme\Microsoft Visual Studio 9.0\VC\bin/link.EXE"' : return code '0x45e'
Stop.
Then I tried to use “pexports.exe” to create a module definition file but got the following message:
C:\home\Rabbitus\CRAN\MyClassIO\bin>pexports libMyClassIOMT.dll > libMyClassIOMT.exp
pexports: libMyClassIOMT.dll: could not load PE image
Since I am not able to create a module definition file I am currently using the following option when defining class “MyClassIO”:
#define DllExport __declspec( dllexport )
class DllExport MyClassIO
{
private:
const char *fString;
public:
MyClassIO();
virtual ~MyClassIO();
virtual void ReadFileC(const char *infile);
virtual void ReadFileCpp(const char *infile);
virtual void WriteFileC(const char *outfile);
virtual void WriteFileCpp(const char *outfile);
virtual void ReadIFileStream(ifstream &input);
virtual void WriteOFileStream(ofstream &output);
};
Although this option works perfectly fine on WinXP, i.e. library “MyClass.dll” can call “libMyClassIOMT.dll”, this is not a solution since the
code for the class definition is VC++ specific. Thus I have the following questions:
1, How do I create a correct module definition file for class “MyClassIO”?
2, How does ROOT handle this case? (Obviously ROOT does not use DllExport)
For your information I am attaching the complete source code for library “libMyClassIO”.
Best regards
Christian
MyClassIO.tar.gz (93.2 KB)