如何告诉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")