对于生成库所需的头文件,可以在库的头文件中添加宏定义,由CMake得到VS项目会自动生成宏(项目名+"_EXPORTS")
我们可以通过下列方式定义一个导入导出宏(testLib为当前的项目名称):
#ifdef testLib_EXPORTS //定义了该宏的才为导出,否则均为导入
#define DLL_INTERFACE_API _declspec(dllexport)
#else
#define DLL_INTERFACE_API _declspec(dllimport)
#endif
如果需要导出类,写法为:
extern "C" //为了让dll更加通用,推荐使用extern "C"对需要导出的类和函数包一下
{
DLL_INTERFACE_API void testFun();
DLL_INTERFACE_API class MyClass
{
};
}
注意,如果只导出类,没有任何函数声明加了DLL_INTERFACE_API,即没有函数或方法被导出时,则CMake出来的VS项目编译会生成DLL,但不会生成对应的lib导入库文件,编程测试工程时,应注意这一点!比如这里就加了testFun()。
生成库的CMakeLists.txt中使用下列语法添加库文件,VS会自动生成相应的项目(${SRC}变量表示生成库所需源码的合集)
语法:add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
示例:add_library(testLib SHARED ${SRC})
在要调用接口的项目中,可通过如下方法查找之前生成的导入库并存入TestLib变量中,并在target_link_libraries中使用即可。
find_library(TestLib testLib ${CMAKE_CURRENT_SOURCE_DIR}/lib)
if (NOT TestLib) #如果TestLib中没有有效值,即没找到该库则终止报错
message(FATAL_ERROR "testLib library cannot be found!")
endif ()