以下总结只针对windows平台:
- dll文件应有static 和 dynamic的版本,编译时临时文件的目录分别是: Debug, Release, DebugDll, ReleaseDll。
- 一般推荐使用dll的static版本,因为这样就不用指定dll文件所在的路径,以后对文件大小或其它要求时再换成dynamic版本的;但中间要注意的是:如果static版本文件有所改变,依赖其的项目要手动重新编译,不然使用的还是老版本的static 库。
- dll文件命名为: XxD.lib(Debug), Xx.lib(Release), XxD_dll.lib(Debug Dynamic), Xx_dll.lib(Release Dynamic), 如果是Unicode版本,在相应的'.'或'D'字符前加U,如:XxUD.lib(Debug Unicode), XxU.lib(Release Unicode)。
- 作为第三方API时,应提供完整的include, lib, bin目录,readme.txt文件,可选择提供example, doc目录。 其中:include文件夹中放依赖的头文件;lib中放所有的*.lib文件;bin中放所有的*.dll文件。
- 作为第三方API时,最好是通过def的方式生成,这样可以跨语言使用。如果只限于c++调用,并且要导出的类比较多,则可以折中考虑使用dllexport的方式。
以下总结是以前在Linux平台:(Eclipse+CDT)
- 如何新建库项目: 先新建一空项目,再修改设置:项目Property页--->C/C++ Buildings--->Settings--->Build Artifact--->Artifact Type中选择库类型。
- 静态库使用:
- 设置include头文件目录:.I./../XxLib/include;
- 设置Linker库文件目录: -L./../XxLib/lib;
- 设置Linker库文件: -lXxLib
- 动态库使用:
- 隐式调用同上面的静态库;
- 显式调用在Linker中: -ldl -lXxLib;
- 如果动态库不是放在/lib,/usr/lib目录下,需设置环境变量:LD_LIBRARY_PATH=./../XLib/lib
- 当同时存在该库的静态版本和共享版本时,链接器优先使用共享版本Xx.so,此时你可以使用-static链接选项指定链接静态版本Xx.a
- 动态库可以导出两个特殊的函数:_init和_fini,前者在动态库被加载后调用,后者在动态库被卸载前调用,我们可以使用这两个函数做些特别的工作。需要注意的是:在定义这两个函数后编译时,需要使用-nostartfiles选项,否则编译器报重复定义错误。
- 应用程序与库混合调试:项目Property页--->C/C++ General--->Paths and Symbols--->References--->选择引用库。
- ldd用来查看程序所依赖的共享库,同时也方便我们判断共享库是否被找到; nm命令查看obj文件(.so也是一个obj)中的标识(函数、变量)。
Q:在Linux的DLL中如何使用stdcall调用方式