【WIN32】CMake的学习总结 3——动态库

较于静态库,动态库并没有太大的区别,本文对不同点作一些描述,并讲述使用动态库时遇到的一些问题。

生成静态库/动态库所用的基本命令:

[必] 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动态库还有其他什么方法呢?

下回分解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值