C++ 如何将库静态链接到DLL?

C++ 如何将库静态链接到DLL?,c++,visual-studio,dll,C++,Visual Studio,Dll,我在地狱里。我有2个DLL,比如说A.dll和B.DLL,它们有名字冲突,每个都使用相同的C++类名。等等,两个DLL都可以作为静态LIBs使用。 我是否可以创建一个“wrappe”DLL,比如Aprime.DLL,它导出与a.DLL中类似的类、方法等,并将功能委托给a.lib中的类,但静态链接到Aprime.DLL中?这难道不能避免名称冲突吗 我一直在尝试这个,但不确定我是否正确设置了MSVS项目。正在生成Aprime.dll,但根据依赖关系,Aprime.dll仍在加载一个.dll 我一直在

我在地狱里。我有2个DLL,比如说A.dll和B.DLL,它们有名字冲突,每个都使用相同的C++类名。等等,两个DLL都可以作为静态LIBs使用。 我是否可以创建一个“wrappe”DLL,比如Aprime.DLL,它导出与a.DLL中类似的类、方法等,并将功能委托给a.lib中的类,但静态链接到Aprime.DLL中?这难道不能避免名称冲突吗

我一直在尝试这个,但不确定我是否正确设置了MSVS项目。正在生成Aprime.dll,但根据依赖关系,Aprime.dll仍在加载一个.dll

我一直在搜索,但我发现的大多数东西只适用于CRT或MFC中的静态链接,它们有自己的开关

我在Linker->Input->Additional Dependencies下添加了一个.lib


我是否丢失了一些magic linker命令行开关或其他东西?

是的,该方法应该有效。但关键是要确保Aprime.dll头文件中不包含任何原始A.dll头文件。否则,如果有人包括Aprime.h/pp,那么它将包括A.h/pp,然后您将再次发生冲突

所以你想要的是:

A.h

B.h

Aprime.h

// Proxy class
class myTest
{
}
Aprime.cpp

#include "A.h"
#include "Aprime.h"

...
main.cpp

#include "Aprime.h"
#include "B.h"

...

请注意,main从不同时包含A和B。In只包含Aprime和B。B仍然是静态库,Aprime是一个DLL。

是的,该方法应该可以工作。但关键是要确保Aprime.dll头文件中不包含任何原始A.dll头文件。否则,如果有人包括Aprime.h/pp,那么它将包括A.h/pp,然后您将再次发生冲突

所以你想要的是:

A.h

B.h

Aprime.h

// Proxy class
class myTest
{
}
Aprime.cpp

#include "A.h"
#include "Aprime.h"

...
main.cpp

#include "Aprime.h"
#include "B.h"

...


请注意,main从不同时包含A和B。In仅包含Aprime和B。B仍然是静态库,Aprime是DLL。

是的,您可以,Windows在A支持它
Aprime.DLL
实际上是空的,除了对
a.DLL

的一系列引用之外。是的,您可以这样做,而且Windows在某个时间支持它<除了一组引用“A.DLL > <代码> > < /p> >,我假定这是一个C++问题,所以我添加了标签。它将获得更多的页面浏览量。如果我错了,请删除标记。如果不想加载.dll,当然必须删除A.lib。如果这导致了链接器错误,那么您将不得不做更多的思考。Hans,我不明白-a.lib不是静态链接文件吗?请注意,Windows实际上并不关心DLL中的名称冲突。例如,它们都有一个<代码> DLMNED<代码>。我假设这是一个C++问题,所以我添加了标签。它将获得更多的页面浏览量。如果我错了,请删除标记。如果不想加载.dll,当然必须删除A.lib。如果这导致了链接器错误,那么您将不得不做更多的思考。Hans,我不明白-a.lib不是静态链接文件吗?请注意,Windows实际上并不关心DLL中的名称冲突。例如,它们都有一个<代码> DLMNED<代码>。我假设这是一个C++问题,所以我添加了标签。它将获得更多的页面浏览量。如果我错了,请删除标记。如果不想加载.dll,当然必须删除A.lib。如果这导致了链接器错误,那么您将不得不做更多的思考。Hans,我不明白-a.lib不是静态链接文件吗?请注意,Windows实际上并不关心DLL中的名称冲突。例如,它们都倾向于有一个
DllMain
。因此它可以工作,那么我一定是做错了什么,因为我的Aprime.dll正在加载一个.dll-如果a.lib被静态链接到Aprime.dll,那么它不应该。你确定你使用的.lib是一个静态库,而不是.dll的加载程序吗?克里斯,我如何验证或确认这一点?我已经添加了.lib,这就是我所需要做的吗?我从来都不需要检查,如果我添加了,我只需要创建一个控制台应用程序,包括lib,然后看看它是否运行。如果它抱怨.DLL丢失,那么它是一个lib版本。我确实找到了这篇文章:我使用了你在那个链接中建议的库工具,我使用的是导入库而不是静态库。我不能得到一个真正的静态库,我想我被套住了。但是谢谢你的帮助。这样它可以工作,那么我一定是做错了什么,因为我的Aprime.dll正在加载一个.dll-如果A.lib被静态链接到Aprime.dll,它应该不会。你确定你正在使用的.lib是一个静态库而不是.dll的加载程序吗?克里斯,我如何验证或确认这一点?我已经添加了.lib,这就是我所需要做的吗?我从来都不需要检查,如果我添加了,我只需要创建一个控制台应用程序,包括lib,然后看看它是否运行。如果它抱怨.DLL丢失,那么它是一个lib版本。我确实找到了这篇文章:我使用了你在那个链接中建议的库工具,我使用的是导入库而不是静态库。我不能得到一个真正的静态库,我想我被套住了。但是谢谢你的帮助。这样它可以工作,那么我一定是做错了什么,因为我的Aprime.dll正在加载一个.dll-如果A.lib被静态链接到Aprime.dll,它应该不会。你确定你正在使用的.lib是一个静态库而不是.dll的加载程序吗?克里斯,我如何验证或确认这一点?我已经添加了.lib,这就是我所需要做的吗?我从来都不需要检查,如果我添加了,我只需要创建一个控制台应用程序,包括lib,然后看看它是否运行。如果它抱怨.DLL丢失,那么它是一个lib版本。我确实找到了这篇文章:我使用了你在那个链接中建议的库工具,我使用的是导入库而不是静态库。我不能得到一个真正的静态库,我想我被套住了。但是谢谢你的帮助。