gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:08 25 4
gpt4 key购买 nike

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

到目前为止,只要我使用调试(编译)选项,它就可以正常工作。我能够使用其他项目的 dll 项目。

但是如果 dll projekt 被编译为发布版(工作正常),我不能在其他项目中使用它,因为编译器会提示缺少一些功能,例如TInt 中的 IsValid()。我用dependency walker检查了一下,果然,编译器是对的!成员函数 IsValid() 未导出,连同另一个函数以及构造函数和析构函数。 TInt 的所有其他成员函数都是导出的,我可以使用 dependency walker 看到它们,我可以从其他项目中使用它们。这也以类似的方式发生在另一个类上。

然后我使用 dependency walker 和 winmerge 比较了调试 dll 和发布 dll。它们几乎相同,只是发布的 dll 缺少一些功能(大约 3%)。

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

谢谢!

最佳答案

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

可能是 DllExpImpM 或者其他东西。

如果不是宏,那么构建之间还有什么变化?

关于c++ - 并非所有函数都使用 dllexport 导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20830416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com