这篇文章主要描述如何使用cmake构建一个库工程
文章目录
库工程的代码:头文件和源文件
cpp
#ifndef ADD_H
#define ADD_H
#ifdef _WIN32
#ifdef MYMATH_EXPORTS
#define MYMATH_API __declspec(dllexport)
#else
#define MYMATH_API __declspec(dllimport)
#endif
#else
#define MYMATH_API
#endif
MYMATH_API int add(int a, int b);
#endif // ADD_H
cpp
#include "add.h"
MYMATH_API int add(int a, int b) {
return a + b;
}
add_library
编译库工程把之前的add_excuatable换为add_library
add_library
是 CMake 中用于定义库的命令。它的基本语法是:
cmake
add_library(target_name [STATIC | SHARED | MODULE] source1 [source2 ...])
target_name
是你想要给库定义的名称。[STATIC | SHARED | MODULE]
是库的类型,有三种选择:STATIC
表示静态库,即.lib
文件(在Windows下)或者.a
文件(在Linux下)。SHARED
表示动态共享库,即.dll
文件(在Windows下)或者.so
文件(在Linux下)。MODULE
表示模块,一般在使用INSTALL(TARGETS ...)
时使用。
对于你的问题,add_library(${LIBRARY_NAME} SHARED ${cpp_list} ${h_list})
意味着你正在创建一个动态共享库(DLL,在Windows下)并将指定的源文件 ${cpp_list}
和头文件 ${h_list}
编译为这个库。
一些说明:
- 通常,如果你希望库在运行时动态加载(即在运行时可以通过
LoadLibrary
或类似的机制加载),你会选择SHARED
。 - 如果你希望生成一个静态库,即链接到可执行文件时被静态链接,你可以选择
STATIC
。 - 如果你的库是一个插件,可能使用
MODULE
。
在这种情况下,SHARED
表示你正在创建一个动态库。
install
看这个:https://zhuanlan.zhihu.com/p/102955723
在cmake中添加这个
c
install(TARGETS ${LIBRARY_NAME}
LIBRARY DESTINATION lib/$<CONFIG>
ARCHIVE DESTINATION lib/$<CONFIG>
RUNTIME DESTINATION bin/$<CONFIG>
PUBLIC_HEADER DESTINATION include
)
# 头文件有时候不能自动拷贝,所以加上下面这个
# Install headers
file(GLOB LIBRARY_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
install(FILES ${LIBRARY_HEADERS} DESTINATION include)
先编译,然后运行install,直接安装到默认位置了C:/Program Files (x86)
c
PS E:\workspace\cmake_demo\simple_demo\module\module_build> cmake --install . --config Debug
-- Installing: C:/Program Files (x86)/MyMathLibrary/lib/Debug/MYLIB_x64d_msvc.lib
-- Installing: C:/Program Files (x86)/MyMathLibrary/bin/Debug/MYLIB_x64d_msvc.dll
-- Up-to-date: C:/Program Files (x86)/MyMathLibrary/include/add.h
PS E:\workspace\cmake_demo\simple_demo\module\module_build> cmake --install . --config Release
-- Up-to-date: C:/Program Files (x86)/MyMathLibrary/lib/Release/MYLIB_x64_msvc.lib
-- Up-to-date: C:/Program Files (x86)/MyMathLibrary/bin/Release/MYLIB_x64_msvc.dll
-- Up-to-date: C:/Program Files (x86)/MyMathLibrary/include/add.h
修改安装路径
c
方法1:修改cmake文件。在cmake文件中加入set(CMAKE_INSTALL_PREFIX "../install")。
方法2:修改cmake命令参数。cmake -DCMAKE_INSTALL_PREFIX="../install"
使用方法2
c
PS E:\workspace\cmake_demo\simple_demo\module\module_build> cmake -DCMAKE_INSTALL_PREFIX="../install" ..
-- Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22631.
-- ^^^^^^Compiler: MSVC
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: E:/workspace/cmake_demo/simple_demo/module/module_build
PS E:\workspace\cmake_demo\simple_demo\module\module_build> cmake --install . --config Release
-- Installing: E:/workspace/cmake_demo/simple_demo/module/install/lib/Release/MYLIB_x64_msvc.lib
-- Installing: E:/workspace/cmake_demo/simple_demo/module/install/bin/Release/MYLIB_x64_msvc.dll
-- Installing: E:/workspace/cmake_demo/simple_demo/module/install/include/add.h
其实不止库工程可以install,可执行文件也可以install