导出DLL的namespace 问题

penguinhehe 2010-03-10 03:12:27
问题2个DLL导出的方法名称相同,所以想用namespace加以处分,可是失败了,为什么,怎么解决?

dll1
导出头文件
namespace MyDll{
MYDLL_API int fnMyDll(void);
}
实现
namespace MyDll {
MYDLL_API int fnMyDll(void)
{
std::cout << "MyDll::fnMyDll" << std::endl;
return 42;
}
}

dll2 类似 只是Namespace 变成了MyDll2
namespace MyDll2{
MYDLL2_API int fnMyDll(void);
}
实现
namespace MyDll2 {
MYDLL2_API int fnMyDll(void)
{
std::cout << "MyDll2::fnMyDll" << std::endl;
return 42;
}
}

调用者
MyDll::fnMyDll();
MyDll2::fnMyDll();

结果
MyDll::fnMyDll
MyDll::fnMyDll

没有调用 MyDll2::fnMyDll 为什么,怎么解决?

ps 导出类的话,用以上写法成功了,用Denpendency查看,导出类的方法都有namespace的描述,而导出的API却没有,哪里写错了?
...全文
763 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
emp 2010-03-12
  • 打赏
  • 举报
回复
extern "C",应该是这个出了问题
OOOqqqOOO 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 penguinhehe 的回复:]
4楼说的不错,是可以,我又看了一下,原来我的代码 在导出的时候, 使用了extern "C" {}
去掉之后,就OK了。本计划想使隐性和显性都通用,看来难以如愿了。
虽然具体原理不慎明了,我有以下想法,也不知对不对

1 extern "C" 按照C规则编译,即按函数名编译(不能重载),估计C规则没有namespace 吧
2 如果是显性调用(LoadLibary),可以重命名,就不会有……
penguinhehe 2010-03-12
  • 打赏
  • 举报
回复
4楼说的不错,是可以,我又看了一下,原来我的代码 在导出的时候, 使用了extern "C" {}
去掉之后,就OK了。本计划想使隐性和显性都通用,看来难以如愿了。
虽然具体原理不慎明了,我有以下想法,也不知对不对

1 extern "C" 按照C规则编译,即按函数名编译(不能重载),估计C规则没有namespace 吧
2 如果是显性调用(LoadLibary),可以重命名,就不会有重复的情况,

估计导出namespace就是给隐性调用准备的吧,不能兼容,略感遗憾,不知还有什么高见,不吝赐教。
yuzl32 2010-03-10
  • 打赏
  • 举报
回复
测试了一下,完全可以区分开来。

//文件:MyDll.cpp
//编译:cl /EHsc /c MyDll.cpp
//链接:link /DLL MyDll.obj
#include <iostream>
using namespace std;

namespace MyDll
{
__declspec(dllexport) int fnMyDll(void)
{
std::cout << "MyDll::fnMyDll" << std::endl;
return 42;
}
}

//文件:MyDll2.cpp
//编译:cl /EHsc /c MyDll2.cpp
//链接:link /DLL MyDll2.obj
#include <iostream>
using namespace std;

namespace MyDll2
{
__declspec(dllexport) int fnMyDll(void)
{
std::cout << "MyDll2::fnMyDll" << std::endl;
return 42;
}
}

//文件:Client.cpp
//编译:cl /EHsc Client.cpp
//运行结果:
// MyDll::fnMyDll
// MyDll2::fnMyDll
#include <iostream>

#pragma comment(lib,"MyDll")
#pragma comment(lib,"MyDll2")

namespace MyDll
{
__declspec(dllimport) int fnMyDll();
}

namespace MyDll2
{
__declspec(dllimport) int fnMyDll();
}

int main(void)
{
MyDll::fnMyDll();
MyDll2::fnMyDll();
}
taodm 2010-03-10
  • 打赏
  • 举报
回复
珍惜生命,远离扩展dll,只使用纯C接口的标准dll
ypb362148418 2010-03-10
  • 打赏
  • 举报
回复
友情UP !
shanliang123 2010-03-10
  • 打赏
  • 举报
回复
不懂,帮你顶一下吧。

64,660

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧