如何编译为静态库或动态库

如何告诉cmake编译为静态库或动态库

要将项目编译为库,使用CMAKE的add_library命令:

add_library(<name> [STATIC | SHARED | MODULE]
              [EXCLUDE_FROM_ALL]
              source1 source2 ... sourceN)

其中,参数STATIC, SHARED, MODULE指定生成库是静态库、动态库或MODULE(具体参照CMAKE文档)。如果没有指定生成STATIC库还是SHARED库,则CMAKE根据变量BUILD_SHARED_LIBS确定编译类型。当BUILD_SHARED_LIBS为true,编译为动态库;否则,编译为静态库。


如何构建Windows平台下的动态库DLL

在构建动态库时,生成两个文件:导入库(.lib)和动态库(.dll)。GCC和mingw默认情况下会导出所有符号,但是vs默认情况下不导出任何符号。如果dll没有导出任何符号,则vs就不会生成导入库(这就是为什么vs构建dll时只生成了.dll,没有生成.lib的原因)。如果要导出函数或类型,必须使用 __declspec( dllexport )。
在VS平台构建dll库时,CMAKE会添加如下预处理定义
MyLibrary_EXPORTS
其中,MyLibrary是目标的名字。在程序代码中,需要使用这个定义,如
#if defined (_WIN32) 
  #if defined(MyLibrary_EXPORTS)
    #define  MYLIB_EXPORT __declspec(dllexport)
  #else
    #define  MYLIB_EXPORT __declspec(dllimport)
  #endif /* MyLibrary_EXPORTS */
#else /* defined (_WIN32) */
 #define MYLIB_EXPORT
#endif

现在,对与想导出的类或者函数,只需要进行如下声明:
// 导出整个类
class MYLIB_EXPORT Foo
{
    //
};

// 导出类的静态函数
class Foo
{
public:
    static MYLIB_EXPORT void fun();
};

注:
如果不想使用CMAKE默认的预定义符号MyLibrary_EXPORTS,也可以自己定义符号。如需要定义预处理符号COMPILING_DLL,方法如下:
set_target_properties(MyLibrary PROPERTIES DEFINE_SYMBOL  "COMPILING_DLL")


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值