较于静态库,动态库并没有太大的区别,本文对不同点作一些描述,并讲述使用动态库时遇到的一些问题。
生成静态库/动态库所用的基本命令:
[必]
add_libraries
命令生成库,区别在于一个参数STATIC/SHARED
[选] 设置target属性
[选] target输出目录注:在此提到的是生成库的基本命令,更多命令可参考CMake命令手册;
引用静态库/动态库所用的命令:
[必]
include_directories
指定库的头文件路径
[必]link_directories
指定库路径
[必]target_link_libraries
命令链接库注:在此提到的是生成库的基本命令,更多命令可参考CMake命令手册;
下面描述使用动态库的与静态库之间的不同点:
# 生成静态库
# xmathlib子目录:xmathlib/CMakteLists.txt
add_libraries(xmath-static STATIC ${file_src} ${file_inc})
# 生成动态库
# xmathlib子目录:xmathlib/CMakteLists.txt
add_difinitions("-DLIBHELLO_BUILD")
add_libraries(xmath-shared SHARED ${file_src} ${file_inc})
# 引用静态库:
# src子目录:src/CMakteLists.txt
...
include_directories(xmath-static ${lib_inc})
link_directories(xmath-static ${lib_dir})
...
target_link_libraries(xmath-static xmathd)
# 引用动态库:
# src子目录:src/CMakteLists.txt
...
include_directories(xmath-shared ${lib_inc})
link_directories(xmath-shared ${lib_dir})
...
target_link_libraries(xmath-shared xmath.dll)
由此看出,动态库与静态库间的几乎完全是一样的,关于CMake的配置,只要按照上面作稍微的修改即可;
在此我想说期间碰到的一个问题:
错误:编译动态库时发生错误:error LNK1024: 无法打开文件libxmath.lib
现象:在编译动态库时,本应该同时生成 libxmath.dll, libxmath.exp, libxmath.lib 3个文件,然而本人在编译时却只有一个libxmath.dll文件;因为生成动态库时没有生成lib文件,所以无法打开文件libxmath.lib;归根到底就是编写的动态库有问题;
http://blog.csdn.net/dbzhang800/article/details/6314073
查看资料后,得知这个是与windows下的不兼容导致的(在linux下则不影响);也就是说只要正确编译动态库,就能解决以上的问题;
因此对xmath.h头文件作如下的修改:
// file: xmatlib/xmath.h
#ifndef XMATH_H
#define XMATH_H
#if defined _WIN32
#if LIBHELLO_BUILD
#define LIBHELLO_API __declspec(dllexport)
#else
#define LIBHELLO_API __declspec(dllimport)
#endif
#else
#define LIBHELLO_API
#endif
LIBHELLO_API double addition(double v1, double v2);
LIBHELLO_API double multiple(double v1, double v2);
#endif // XMATH_H
其他源文件不变,修改完成后使用CMake重新生成vs工程后,编译xmath-shared项目后,生成如下文件:libxmath.dll, libxmath.exp, libxmath.lib 3个文件;
编译test成功,没有发生错误!问题得到了解决。
疑问:
为什么要作这样的修改才能正确编译动态库dll呢?
其中的奥妙是什么呢?
正确编译DLL动态库还有其他什么方法呢?
下回分解