关于C++的动态库

论坛里有好多人一提到C++的DLL都立马大叫,珍爱生命远离C++动态库。我表示十分不解。

不用动态库来封装类,难不成用静态库么?还没有悔改放弃静态库的请参见http://blog.csdn.net/a63140180/article/details/19053849

不用C++的动态库,难道我要为每个类写一个C语言的函数返回它吗?每个类都带一条extern "c"的猪尾巴,好看么?

所以想不出不用c++的动态库的理由。


在导出c++动态库的时候还有一些幺蛾子需要提一下。

1,关于导出宏

一般导出库都这样写

#ifdef _WINDLL
    #define INTERFACE _declspec(dllexport)
#else
    #define INTERFACE _declspec(dllimport)
#endif
函数是把INTERFACE放最前,比如INTERFACE int func();   类是放在class后面    class INTERFACE MyObject{    };

如果你的库只在exe使用,这样写是没问题的,如果你需要在另一个DLL库里引用这个库问题就来了,你本想import此库,无奈在另一个DLL里_WINDLL 也是定义的,所以INTERFACE会变成export而不是import。我采用的解决方案是每个DLL工程都加入自己的宏来决定是否引入,而不是VS自动提供的_WINDLL宏。这样不同的工程拥有不同的宏就区分开了。

这里提一点,加导入宏的时候可以直接加进     属性->c/c++->预处理器->预处理器定义  里,这样就不用每次都修改代码了。


2,模板的导出:

模板其实不用导出,这里只是骗骗傻逼编译器。

编译器自己定义了一个规则,就是模板只能导出不能导入。因此除了上面提到的控制导出导入的宏之外,还需要特地给导出导入模板设置一个宏。

比如:

#ifdef EXPORT_PROJECTNAME_TEMPLATE
	#define TEMPLATE_INTERFACE _declspec(dllexport)
#else
	#define TEMPLATE_INTERFACE
#endif

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值