本人最近想做一个项目
其中 文件A.dll里面和B.dll里面有相同的类名,类里面的方法也基本相同 但还是有差异 于是本人再用隐式方法将他们分别导入后 为了防止重复编辑 采用命名空间namespace分别将他们分开 但是再实例化的时候 静态的函数不能解析 报错lnk2019
//文件A.h
#pragma comment(lib,"A.lib")
#if !defined(TEST_A_H)
#define TEST_A_H
namespace MyspaceA {
#if defined(ISLIB) && defined(WIN32)
#ifdef LIB_TEST_A_EXPORT
#define TEST_A_EXPORT __declspec(dllexport)
#else
#define TEST_A_EXPORT __declspec(dllimport)
#endif
#else
#define TEST_A_EXPORT
#endif
class TEST_A_EXPORT Test
{
public:
static TestA* testFunc(const char* var = "");
...
}
}
//文件B.h
#pragma comment(lib,"B.lib")
#if !defined(TEST_B_H)
#define TEST_B_H
namespace MyspaceB {
#if defined(ISLIB) && defined(WIN32)
#ifdef LIB_TEST_B_EXPORT
#define TEST_B_EXPORT __declspec(dllexport)
#else
#define TEST_B_EXPORT __declspec(dllimport)
#endif
#else
#define TEST_B_EXPORT
#endif
class TEST_B_EXPORT Test
{
public:
static TestB* testFunc(const char* var = "");
...
}
}
//再调用的文件中C.h
namespace MyspaceA {
class RunA
{
public:
void run();
}
}
// C.cpp
using namespace MyspaceA;
void RunA::run(){
TestA::testFunc()
}
//再调用的文件中D.h
namespace MyspaceB {
class RunB
{
public:
void run();
}
}
// D.cpp
using namespace MyspaceB;
void RunB::run(){
TestB::testFunc()
}
//main.cpp
#include "A.h"
int{
using namespace MyspaceA;
run = RunA();
run.run();
return 0;
}
报错就是LNK2019 说无法解析TestA* testFunc(const char* var = "")...
你导入的名称空间得跟DLL导出的一致不然链接器会找不到。链接器是不懂名称空间是什么玩意的,它用来查找的函数名字是名称空间+类名+函数名+参数+修饰。找到的第一个结果会被使用。因为你有两个lib有同名的函数名所以产生歧义,只要你在同一个项目中同时链接这两个DLL的lib,就会有一个DLL的会被忽略。
你可以为这两个DLL分别写封装DLL,导出有名称空间的包装类——或者更加优雅一点,用工厂模式导出一个共同的接口类。这样你这两个DLL会被分开链接,不会有歧义。
人家的头文件,你怎么好随意修改。。。 那你为什么不直接改类名 改函数名? 和你随意添加命名空间是一样的不可行的啊。。。
你需要同时改dll实现。。 如果没有dll代码,你就需要自己重新封装一遍了。
应该是引入没有正确配对。
建议参考如下文档。
使用时,加上命名空间
没有正确导入,网上找一个demo看一下就明白了
您的问题已经有小伙伴解答了,请点击【采纳】按钮,采纳帮您提供解决思路的答案,给回答的人一些鼓励哦~~
ps:开通问答VIP,享受5次/月 有问必答服务,了解详情↓↓↓
【电脑端】戳>>> https://vip.csdn.net/askvip?utm_source=1146287632
【APP 】 戳>>> https://mall.csdn.net/item/52471?utm_source=1146287632