鉴于Foo
和Bar
类Bar
来自Foo
,我怎样才能导出Bar
而无需导出Foo
?
的 foo.h中
class Foo
{
public:
Foo();
virtual bool Read(...);
virtual bool Write(...);
~Foo();
};
的 Bar.h
#ifdef BUILD_DLL
# include "Foo.h"
# define EXTERNAL __declspec(dllexport)
#else
# define EXTERNAL __declspec(dllimport)
#endif
class EXTERNAL Bar: public Foo
{
public:
Bar();
bool Read(...);
bool Write(...);
~Bar();
};
的修改
这是Visual C ++ 2010给我的警告:
警告C4275:非dll接口类'Foo'用作dll接口类'Bar'的基础
编辑#2
这就是我解决问题的方法。我将Foo
和Bar
分开了DLL。客户端应用程序链接到Bar.dll和Bar.dll链接到Foo.dll。这适用于我想要实现的目标......
答案 0 :(得分:3)
这不起作用吗?这应该。仅仅因为你没有明确地导出类并不意味着逻辑不在二进制文件中。导入该类的任何内容都不会显示这些符号。
您的解决方案应该这样做。您是否收到链接错误或什么?
编辑:我刚看到你只在一个案例中包含了Foo
的标题。你不需要这样做:
#ifdef BUILD_DLL
# define EXTERNAL __declspec(dllexport)
#else
# define EXTERNAL __declspec(dllimport)
#endif
#include "Foo.h"
class EXTERNAL Bar: public Foo
{
public:
Bar();
bool Read(...);
bool Write(...);
~Bar();
};
这样您就无法在其他模块中使用Foo
,因为它未导出,但您可以使用并声明Bar
。
答案 1 :(得分:1)
需要Foo来创建一个Bar实例 - 事实上,为了创建Bar,Foo的构造函数在Bar的构造函数之前被调用。
我非常怀疑你可以导出一个并在不导出另一个的情况下使用它。
答案 2 :(得分:1)
我不确定这有什么好处?
如果您只是试图向您的客户隐藏Foo(就像我有时这样做,但不是Foo),只需像往常一样将其导出......
从中创建一个Dll(将Foo.cpp链接到您的Bar.dll)并从您使用库/ Dll文件传递的标头中删除Foo类。
dll的用户看不到一个被编程的类(当你不选择使用#define EXTERNAL __declspec(dllexport)导出这个类的方法时。
所以:Foo对用户/客户隐藏。
放松一下;)
答案 3 :(得分:0)
如前所述,你不能按照你的建议做到这一点。
您能否提供您的用例说明?可能其他一些决定会有所帮助吗? F.ex.如果你需要在dll之外传递Bar对象,你可以创建它的接口并显示它而不是Bar对象。