这个问题可能类似于 DLL Exports: not all my functions are exported 但由于那里没有完全回答,我不得不再问一遍。我的情况也是因为使用模板并导出整个类略有不同。
使用环境:VS2008,cl9.0。
我创建了一个dll项目,并添加了大约40个文件(每个类一个文件),主要是标题,因为很多类都是模板。遗产的一个例子是:
// Class1.h
template<class TYPE>
class TInt
{
// Some member functions here
// Also a function bool IsValid() const;
};
// Implementation of template here in the header
// Class2.h
#ifndef DllExpImpM
#define DllExpImpM __declspec(dllimport)
#endif
class DllExpImpM CInt : public TInt<double>
{
// Some member functions here
};
// Class2.cpp
// Some includes, including "stdafx.h", which sets DllExpImpM
// to __declspec(dllexport)
template class DllExpImpM TInt<double>;
// Implemenation of CInt
到目前为止,只要我使用debug(compile)选项,它就可以正常工作。我能够使用其他项目中的dll项目。
但是如果将dll projekt编译为release(工作正常),我就不能在其他项目中使用它,因为编译器抱怨某些缺少的函数,例如TI中的IsValid()。我使用依赖walker来检查它,实际上,编译器是正确的!不导出成员函数IsValid(),以及另一个函数以及构造函数和析构函数。 TInt的所有其他成员函数都被导出,我可以使用依赖walker看到它们,我可以从其他项目中使用它们。这也与其他一个类似的方式发生。
然后我使用dependency walker和winmerge比较了调试dll和release dll。它们几乎相同,只是释放dll缺少一些功能(约3%)。
我不知道出了什么问题。我知道我没有太多的信息(整个信息太大了,我还找不到一个不起作用的简单例子)对我来说听起来有点奇怪。但也许那里的任何人曾经遇到过同样的问题。我非常感谢每一个想法。
谢谢!
答案 0 :(得分:0)
如果它适用于调试,但不适用于发布,那么您需要确定不同的内容。我的第一个猜测是#define
宏或等效的/D
宏我们没有被定义或被错误地定义。
可能是DllExpImpM
或者其他可能。
如果不是宏,那么构建之间会发生什么变化?
答案 1 :(得分:0)
以下是我遇到此事时发现的一些事情。
我有同样的问题,但取消/ GL参数没有任何区别。
我的第一个测试是创建一个非常简单的函数 - void test() - 并尝试导出它。直到我摆脱了整个输出目录(在我的情况下为x64)并重建它之后,这才起作用。它会猜测某些中间文件会弄乱我的编辑,无论如何,我没有进一步调查它。
但仍有一个功能无法导出。我花了一些时间才意识到.h文件中的声明不能完全匹配.cpp文件中的签名!我在.h文件中缺少一个参数...我不知道它为什么甚至编译,无论如何,修复它允许导出函数。