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

相关推荐
十五年专注C++开发1 小时前
CMake基础:条件判断详解
c++·跨平台·cmake·自动化编译
mrbone112 天前
Git-git worktree的使用
开发语言·c++·git·cmake·worktree·gitab
stonewu13 天前
Cmake入门及CMakeLists.txt 语法介绍
c++·cmake
不知所云,14 天前
QT vscode cmake 编译 undefined reference to `vtable for 问题解决
vscode·qt·cmake
不想被吃掉氩15 天前
CMAKE
windows·unix·cmake
咩咩大主教17 天前
2025最新版使用VSCode和CMake图形化编译调试Cuda C++程序(保姆级教学)
c++·vscode·cmake·visual studio·cuda·cpp·cuda c++
十五年专注C++开发17 天前
CMake实践:指定gcc版本编译和交叉编译
linux·开发语言·c++·cmake·自动化编译
十五年专注C++开发21 天前
Qt .pro配置gcc相关命令(三):-W1、-L、-rpath和-rpath-link
linux·运维·c++·qt·cmake·跨平台编译
old_power1 个月前
在 Windows 系统下配置 VSCode + CMake + Ninja 进行 C++ 或 Qt 开发
c++·windows·vscode·cmake·ninja
子正1 个月前
一键编译包含多个独立模块和应用的工程(linux cmake)
linux·运维·cmake