论坛里有好多人一提到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