Cmake基础(5)

这篇文章主要描述如何使用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

相关推荐
Mundaneman3 天前
CMake所学
开发语言·学习·cmake·clang
jyl_sh4 天前
CMake教程:第一步:一个基本的起点
开发语言·c++·客户端·cmake
码农心语6 天前
用CMake添加gtest测试用例gtest_discover_tests指令函数的分析
测试用例·cmake·添加·原理分析
YRr YRr8 天前
CMake 中 add_definitions() 使用的注意事项及替代方案
linux·c++·windows·cmake
YRr YRr8 天前
g++的一些常用标识
linux·开发语言·c++·cmake
___波子 Pro Max.9 天前
CMake set_property设置全局变量属性
cmake
YRr YRr11 天前
详解 CMake 命令:启用详细 Makefile 输出
linux·开发语言·c++·cmake
YRr YRr13 天前
使用 CMake 创建和调用动态库在 Windows 和 Ubuntu上的差异
linux·windows·ubuntu·cmake
charlee4420 天前
CMake构建学习笔记17-uriparser库的构建和使用
学习·cmake·c/c++·uri
charlee4420 天前
CMake构建学习笔记15-组建第一个程序项目
笔记·cmake·c/c++·构建