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

来源:互联网 发布:如何做学术海报 知乎 编辑:程序博客网 时间:2024/06/06 05:48

如何告诉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
原创粉丝点击