Cmake学习

2023-11-19

Cmake学习

CMake调用boost的编译脚本

cmake_minimum_required(VERSION 3.14)
project(boost_python)
#设置支持C++11特性
set(CMAKE_CXX_STANDARD 11)
#指定boost根目录
set(BOOST_ROOT E:/local/boost_1_61_0)
#设置不适用系统的的boost的库
set(BOOST_NO_SYSTEM_PATHS ON)
#设置使用静态的boost库
set(Boost_USE_STATIC_LIBS ON)
#查找boost库
find_package(Boost COMPONENTS thread system REQUIRED)

#如果已经找到
if(Boost_FOUND)
	MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}.")
    MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}.")
    MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}.")
    MESSAGE( STATUS "Boost_LIBRARY_DIRS = ${Boost_LIBRARY_DIRS}.")
    include_directories(${Boost_INCLUDE_DIRS}
						${CMAKE_CURRENT_SOURCE_DIR}/3Party/websocketpp-master)
    link_directories(${Boost_LIBRARY_DIRS})
    add_executable(boost_python src/main.cpp)
    target_link_libraries (boost_python ${Boost_LIBRARIES})
endif()

常见命令学习

SET(SRC_LIST main.c)  #将.c文件设置到变量SRC_LIST里面,可以设置多个函数链接变量,

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) #将生成的可执行文件放到build目录下的bin文件下
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) #将生成的lib库,放到build目录下的lib文件下。
set( CMAKE_BUILD_TYPE "Debug" )  # "REALEASE" 


${PROJECT_BINARY_DIR} #一般就是build目录下
${PROJECT_SOURCE_DIR} #就是CmakeLists.txt的同级目录。

ADD_SUBDIRECTORY(src )  #有多个目录的时候,每个目录都要写一个CmakeLists.txt文件,将这个文件包含进来。

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"..)
                      SATUS ,输出前缀为 — 的信息,  FATAL_ERROR,立即终止所有 cmake 过程, SEND_ERROR,
                      产生错误,生   成过程被跳过。
SHARED,动态库   STATIC,静态库   MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})  #生成库文件
SET(LIBRARY_OUTPUT_PATH   <路径>) #将生成的库放到指定路径下

#设置库文件的版本和多个同名字的库文件,还不是很懂!!
SET_TARGET_PROPERTIES,其基本语法是:
SET_TARGET_PROPERTIES(target1 target2 ...                               
														PROPERTIES prop1 value1   
														prop2 value2 ...)
#可执行文件链接库文件												
TARGET_LINK_LIBRARIES(main libhello.a)
#查看可执行文件链接的库文件
ldd mian   #main是可执行文件


#这条指令可以用来向工程添加多个特定的头文件搜索路径
1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以将添加的头文件
     搜索路径放在已有路径的前面
 2,通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。
include_directories(/usr/include/hello)  #这是绝对路径,可以配合CMAKE_INCLUDE_DIRECTORIES_BEFORE使用

#下面用来找特定路径的头文件和库文件,要在~/.bashrc里面设置路径
#如 export ASIO_ROOT="/home/jb/install/asio"
# 如 export  CMAKE_INCLUDE_PATH=“/home/include”
特殊的环境变量 CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH
#当然也是可以直接include_directories()绝对路径来查找,但是设置环境变量的方法比较智能,看起来高大尚,我刚#开始也是被搞懵逼了。

这里简单说明一下,FIND_PATH 用来在指定路径中搜索文件名,比如:
FIND_PATH(myHeader NAMES hello.h  PATHS /usr/include   /usr/include/hello)
FIND_PATH(myHeader hello.h)  #cmake会区会去~/.bashrc里面的路径查找哪个有hello.h的头文件,然后将该文件的路径给myHeader
IF(myHeader)   #如果找到路径
    INCLUDE_DIRECTORIES(${myHeader})  #那就包含进来。
ENDIF(myHeader)





CMAKE_INSTALL_PREFIX 变量类似于 configure 脚本的 – prefix,常见的使用方法看起来是这个样子:
  cmake -DCMAKE_INSTALL_PREFIX=/usr .   #/usr .代表要安装的目录,可以更改
  #常见的命令例子
  ARCHIVE 特指静态库,  LIBRARY 特指动态库,  RUNTIME特指可执行目标二进制
  INSTALL(TARGETS ${PROJECT_NAME}                #可执行文件
                    RUNTIME DESTINATION bin                    #可执行文件的目录bin
                    LIBRARY DESTINATION lib                       #lib的目录lib
                    ARCHIVE DESTINATION libstatic           #动态库的目录libstatic
)
INSTALL(FILES COPYRIGHT README DESTINATION   doc/cmake/t2) #将文件COPYRIGHT README放到doc/cmake/t2目录下
INSTALL(PROGRAMS run.sh DESTINATION bin) #将sh文件放到bin目录下
INSTALL(DIRECTORY doc/ DESTINATION doc/cmake/t2) #将doc目录下的内容安装到doc/cmake/t2目录下

#执行
cmake -DCMAKE_INSTALL_PREFIX=/home/jb/install/Test
make
make install
1.CMAKE_SOURCE_DIR == PROJECT_SOURCE_DIR
2.CMAKE_BINARY_DIR == PROJECT_BINARY_DIR

3.CMAKE_CURRENT_SOURCE_DIR  #指的是当前处理的 CMakeLists.txt 所在的路径,比如上面我们提到的 src 子目录。
4.CMAKE_CURRRENT_BINARY_DIR  #他指的是 target 编译目录。
5.CMAKE_CURRENT_LIST_FILE #输出调用这个变量的 CMakeLists.txt 的完整路径
6.CMAKE_CURRENT_LIST_LINE #输出这个变量所在的行

7,CMAKE_MODULE_PATH
#这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己
#编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理
#CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设
#置一下。比如
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
#这时候你就可以通过 INCLUDE 指令来调用自己的模块了。

8.使用$ENV{NAME}指令就可以调用系统的环境变量了。
#比如
MESSAGE(STATUS “HOME dir: $ENV{HOME})
#设置环境变量的方式是:
SET(ENV{变量名})
1 ,BUILD_SHARED_LIBS
这个开关用来控制默认的库编译方式,如果不进行设置,使用 ADD_LIBRARY 并没有指定库
类型的情况下,默认编译生成的库都是静态库。
如果 SET(BUILD_SHARED_LIBS ON)后,默认生成的为动态库。

3,CMAKE_C_FLAGS
设置 C 编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
4,CMAKE_CXX_FLAGS
设置 C++编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
在这里插入代码片
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cmake学习 的相关文章

  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 重载<<的返回值

    include
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • Mybatis/Mybatis-Plus驼峰式命名映射

    目录 一 mybatis驼峰式命名 二 mybatisPlus默认开启驼峰命名映射 一 mybatis驼峰式命名 方法一 使用前提 数据库表设计按照规范 字段名中各单词使用下划线 划分 使用好处 省去mapper xml文件中繁琐编写表字段
  • 团队梯队人才培养模型,60页人才梯队建设与人才培养

    团队梯队人才培养模型 60页人才梯队建设与人才培养 果断收藏 今日头条 人才梯队建设与人才培养 目录 1 人才梯队建设理念 2 人才梯队建设路径 3 梯队人才培养内容与方法 团队总监以上人员管理不成熟的表现 1 无法从项目运作导向转变到战略
  • yolov5 deepsort 行人/车辆(检测 +计数+跟踪+测距+测速)

    功能 简介 实现了局域的出 入 分别计数 显示检测类别 ID数量 默认是 南 北 方向检测 若要检测不同位置和方向 需要加以修改 可在 count car traffic py 点击运行 默认检测类别 行人 自行车 小汽车 摩托车 公交车
  • C++开源序列化库:FStruct

    FStruct是一个用于C 对象 结构体 STL容器等 和json xml字符串之间进行转换的库 采用非入侵方式 无需在原有结构体上进行修改 目前支持基础类型 结构体 以及vector list deque set map等复杂数据类型的序
  • 【C语言】字符串函数介绍三(strstr、strtok、streeror)

    前言 之前我们用两篇文章介绍了strlen strcpy stract strcmp strncpy strncat strncmp这些函数 第一篇文章strlen strcpy stract 第二篇文章strcmp strncpy str
  • 2019年用户流失分析(五)——Python实现

    5 模型应用 选择4月份为正常状态的电视用户 计算他们的收视时长 收视在线天数 距最近一次收视时间 入网时长 用户主动办理次数和投诉与报障次数6个特征指标 利用构建好的用户流失模型预测5月份的用户流失情况 5 1 离网倾向阈值 在4月份为正
  • ThreeJS动态加载div标签

    思路 1 在页面中创建一个div标签 2 确定标签在三维场景中的三维位置 3 计算三维位置的屏幕坐标 4 在每一帧的渲染中都计算一下这个三维坐标的屏幕位置 并把屏幕位置赋给标签 具体实现 1 创建div标签 标签样式 tap positio
  • 脑电EEG代码开源分享 【4.特征提取-频域篇】

    往期文章 希望了解更多的道友点这里 0 分享 脑机接口 人工智能 的学习之路 1 1 脑电EEG代码开源分享 1 前置准备 静息态篇 1 2 脑电EEG代码开源分享 1 前置准备 任务态篇 2 1 脑电EEG代码开源分享 2 预处理 静息态
  • Linux 文件共享(两种方法)

    一 实验目的 快速掌握Linux文件共享 共享文件夹 的两种方法 1 通过虚拟机ubuntu在 mnt hgfs下的共享文件夹映射到物理机实现 2 通过物理机的映射网络驱动器连接到虚拟机ubuntu的共享文件夹实现 二 实验环境 工具软件
  • 《算法图解》——第八章 贪婪算法

    第八章 贪婪算法 1 简单的贪婪算法 每步都采取最优的做法 每步都选择局部最优解 2 背包问题 有些情况下 完美是优秀的敌人 如果你只需要找到一个大致解决问题的算法 贪婪算法挺不错 因为实现容易 结果与正确结果相当接近 练习8 1 你在一家
  • 一文了解Clickhouse

    ClickHouse是什么 ClickHouse是一个存储计算一体的工具 其与spark flink等大数据框架不同的在于它有自己的存储层 在数据压缩 存储上做了更多的优化 所以导致它在某些数据处理能力上比其他工具快上了不少 毕竟一般框架只
  • OpenWrt的SR9000有线网卡驱动

    SR9000芯片的有线网卡驱动可以直接使用kmod usb net CDC ether 若为编译 可采取如下措施 make menuconfig kernel module usb support kmod usb net CDC ethe
  • PAT (Basic Level) Practice 1033 旧键盘打字 Python

    根据题意 这道题让我们根据要求去除第二行输入的字符串中的部分内容 1 判断上档键是否损坏 以进行下一步处理 2 根据要求去除字符串中特定字符 3 sys模块 可用于大量输入的加速 4 operator 可用于运算时的加速 代码如下 impo
  • Eclipse搭建stm32+jlink开发环境全攻略(高级篇)

    Eclipse搭建stm32 jlink开发环境全攻略 高级篇 一 问题概况 通过初级篇的学习 我们知道了一个Eclipse工程的配置以及调试 貌似使用也没什么问题 然而 当我们抛弃掉Eclipse自带的工程模版是 也抛弃的他的一些其他的功
  • 机器学习:多分类的logistic回归

    机器学习 多分类的logistic回归 Multi Class Logistic 多分类的Logistic问题 它适用于那些类别数大于2的分类问题 并且在分类结果中 样本x不是一定只属于某一个类可以得到样本x分别属于多个类的概率 也可以说样
  • Unity3D【脚本】 按键盘Esc弹出退出面板 确定退出游戏 取消关闭面板

    按键盘Esc弹出退出面板 确定退出游戏 取消关闭面板 效果图 脚本 using UnityEngine using System Collections public class Exit MonoBehaviour public Game
  • 【Xilinx】SynchronousInterruptHandler错误排查笔记

    SynchronousInterruptHandler错误排查笔记 一 ArmV8的异常处理 二 64位lscript ld的修改 三 asm vectors S的修改 四 SynchronousInterruptHandler函数解析 五
  • 一篇文章学会使用摩斯密码,简单易懂,你也可以使用“降维打击”

    阅读之前 大家请先看一行符号 看看大家能不能猜出这段符号所代表的含义 相信能看出这段符号含义的人还是占少数 没关系 通过阅读久见菌的这篇文章保证让你能看懂这是什么意思 摩尔斯电码的发明 上面这一串符号就是使用摩尔斯电码打出来的英语单词 摩尔
  • Latex特殊符号大全(高清)

    Latex符号大全 转载内容供自己阅读 原文 Latex特殊符号大全 高清
  • Cmake学习

    Cmake学习 CMake调用boost的编译脚本 cmake minimum required VERSION 3 14 project boost python 设置支持C 11特性 set CMAKE CXX STANDARD 11