cmake-4学习,参考

了解

  • cmake的工作原理:

  • Windows下用cmake编译cmake

(1)先下载cmake(exe)

(2)编译源码文件

# -S表示源文件夹下;-B表示新建一个文件夹build,并将编译结果放在该文件build:【生成】
cmake -S . -B build # -G 使用nmake,指定编译工具
cmake -S . -B build -G "NMake Makefiles" # 生成Xcode执行的文件,
cmake -S . -B xcode -G "Xcode" # 直接打开xcode项目
cmake --open xcode # --build 执行编译(位置)和make功能一样:【编译】
cmake --build build # -j:支持多线程编译和和make一样
cmake --build build -j8 # --config 指定编译方式:Release或者Debug
cmake --build build --config Release # --install 指定安装位置
cmake --install build

动态库和静态库

  • 静态库:编译后的二进制代码,类似.o【编译时链接】

.lib文件:windows

.a文件:linux

举例:linux生成静态库

// xlog.h
#ifndef XLOG
#define XLOG
class xlog
{
public:
xlog();
}; #endif // xlog.cpp
#include "xlog.h"
#include <iostream>
using namespace std; xlog::xlog()
{
cout << "print xlog" << endl;
} # CMakeLists.txt
cmake_minimum_required(VERSION 3.20) project(xlog)
# STATIC:表示生成静态库
add_library(xlog STATIC xlog.cpp xlog.h)

然后执行:

# 生成
cmake -S . -B build
# 编译
cmake --build build

举例:链接静态库

在test_xlog/test_xlog.cpp中链接libxlog.a库

// test_xlog.cpp
#include <iostream>
#include "xlog.h"
using namespace std; int main()
{
xlog log;
cout << "test_xlog" << endl;
return 0;
} # CMakeLists.txt
cmake_minimum_required(VERSION 3.20) project(test_xlog) #指定头文件查找路径
include_directories("../xlog") #指定库查找路径
link_directories("../xlog/build") add_executable(test_xlog test_xlog.cpp) #指定加载的库【静态库:libxlog.a】
target_link_libraries(test_xlog xlog)
  • 动态库: 【运行时链接】

.lib文件(函数地址索引)和.dll文件(函数二进制代码):windows

.so文件:linux

.dylib:macOS

举例:生成动态库并链接使用

# CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(xlog) include_directories("xlog") # 编译生成动态库
add_library(xlog SHARED xlog/xlog.cpp) add_executable(test_xlog test_xlog/test_xlog.cpp)
target_link_libraries(test_xlog xlog)

注意:在windows中生成链接动态库时,需要设置一下才能同时生成:.dll和.lib文件,下面是兼容各平台的代码:

// xlog.h
#ifndef XLOG
#define XLOG #ifndef _WIN32
#define XCPP_API
#else
#ifdef xlog_EXPORTS
#define XCPP_API __declspect(dllexport) //库项目调用
#else
#define XCPP_API __declspect(dllimport) //调用库项目调用
#endif
#endif
class XCPP_API xlog
{
public:
xlog();
};
#endif

cmake-4的更多相关文章

  1. 使用cmake自动构建工程

    公司引擎是用cmake根据目标平台来构建工程的,刚接触的时候深深体会到cmake的方便:如果目标平台是windows,它可以帮你自动构建出vs工程:如果是安卓,自动构建出eclipse工程,如果是IO ...

  2. CMake

    使用CMake编译跨平台静态库 http://www.tuicool.com/articles/3uu2Yj cmake命令 安装.用法简介 https://fukun.org/archives/04 ...

  3. CMake学习笔记

    C++开发者必备技能CMake  先简单介绍一下,CMake是一个跨平台的编译工具,它可以根据不用的平台,不同的编译环境,生成不同的MakeFile,从而控制编译的过程. 使用CMake的步骤: 1. ...

  4. VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4

    对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...

  5. cmake cannot find package

    cmake 找不到package,如 find_package (OpenMesh REQUIRED) 出现错误 在项目的文件夹中找到 FindOpenMesh.cmake 文件,将其所在路径添加到 ...

  6. Cmake的交叉编译

    http://www.cmake.org/Wiki/CMake_Cross_Compiling

  7. CMake命令/函数汇总(翻译自官方手册)

    查看官方文档 cmake命令 选项 CMake变量 CMake命令汇总 / add_custom_command add_custom_target/add_definitions/add_depen ...

  8. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  9. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  10. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

随机推荐

  1. JS中如何获取当前日期,并与输入日期作比较

    首先我们获取到"2020-5-5"类型的值 通过Date函数转换 var inputDate = new Date(Date.parse(realTimeEnd)); 获取当前时间 ...

  2. 一文带你搞懂GaussDB数据库性能调优

    本文分享自华为云社区<[GaussTech技术专栏]GaussDB性能调优>,作者:GaussDB 数据库. 数据库性能调优是一项复杂且系统性的工作,需要综合考虑多方面的因素.因此,调优人 ...

  3. Nuxt.js 应用中的 webpackConfigs 事件钩子

    title: Nuxt.js 应用中的 webpackConfigs 事件钩子 date: 2024/11/20 updated: 2024/11/20 author: cmdragon excerp ...

  4. 关于 java.util.concurrent.RejectedExecutionException

    遇到java.util.concurrent.RejectedExecutionException 目前看来,最主要有2种原因. 第一: 你的线程池ThreadPoolExecutor 显示的shut ...

  5. golang之循环导包

    作为一个 Golang 开发,你可能在项目中遇到过包的循环依赖问题.Golang 不允许循环依赖,如果检测到代码中存在这种情况,在编译时就会抛出异常. 循环依赖 假设我们有两个包:p1和p2.当包p1 ...

  6. Mongodb4.4安装与使用

    MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能 最丰富,最像关系数 ...

  7. idea中yaml文件中文乱码问题解决

    idea打开yaml,或是properties文件,出现中文乱码. 解决步骤: 打开notepad++ ,新建iso-8859-1编码的空文件 将乱码文件通过notepad++直接打开,把正常显示的代 ...

  8. 【Amadeus原创】更改域控域用户密码过期日期时间

    1,打开服务管理器,点工具,选择Active Directory 管理中心 2,右键域名(本地)-属性 3,选择属性编辑器,把maxPwdAge 从90天改成180天.

  9. gradle 很棒

    一直以为 gradle 就是 maven 的一个易读版,表达上比 XML 更精简了,实际上还是maven,似乎没有存在的必要. 但是,万万没想到,这玩意儿竟然是一个语言,竟然可以调试!也就是说,它不是 ...

  10. Uninstall or delete MariaDB completely for re-installation

    I am new to this forum so pse forgive me if I am asking a question which already has been answered. ...