并非所有函数都使用dllexport导出

时间:2013-12-29 21:46:40

标签: c++ visual-studio-2010 dllimport dllexport

这个问题可能类似于 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%)。

我不知道出了什么问题。我知道我没有太多的信息(整个信息太大了,我还找不到一个不起作用的简单例子)对我来说听起来有点奇怪。但也许那里的任何人曾经遇到过同样的问题。我非常感谢每一个想法。

谢谢!

2 个答案:

答案 0 :(得分:0)

如果它适用于调试,但不适用于发布,那么您需要确定不同的内容。我的第一个猜测是#define宏或等效的/D宏我们没有被定义或被错误地定义。

可能是DllExpImpM或者其他可能。

如果不是宏,那么构建之间会发生什么变化?

答案 1 :(得分:0)

以下是我遇到此事时发现的一些事情。

我有同样的问题,但取消/ GL参数没有任何区别。

我的第一个测试是创建一个非常简单的函数 - void test() - 并尝试导出它。直到我摆脱了整个输出目录(在我的情况下为x64)并重建它之后,这才起作用。它会猜测某些中间文件会弄乱我的编辑,无论如何,我没有进一步调查它。

但仍有一个功能无法导出。我花了一些时间才意识到.h文件中的声明不能完全匹配.cpp文件中的签名!我在.h文件中缺少一个参数...我不知道它为什么甚至编译,无论如何,修复它允许导出函数。