首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CMake---优雅构建CC++软件项目实践(1)

这里概括性说明下常用cmake知识,总的来说cmake作用就是让我们找到依赖头文件文件,去编译源文件、链接目标文件(静态也是目标文件一个集合),最后生成可执行文件或动/静态: INCLUDE_DIRECTORIES...将给定目录添加到编译器用于搜索包含文件(如头文件)目录中,相对路径被解释为相对于当前源目录。...}") AUX_SOURCE_DIRECTORY 不会递归包含子目录,包含指定dir目录 ADD_SUBDIRECTORY子模块编译,可以文件夹中或者指定外部文件夹下CMakeLists.txt...模板一 一个独立应用,应用模块之间是相互联系,彼此难以分开,这样简单所有源文件一起头文件一起,这个对于不是很复杂应用是很快速去开始构建和源文件修改操作: . ├── 3rdparty...nanomsg这个开源消息中间件就是头文件和源文件一起,但是作为SDK供外部链接就不是很直接、很方便了,需要做install操作之后才可以或者是头文件搜索范围设置到依赖项目的src级别,且src

8K52

cmake快速入门「建议收藏」

但是,这种做法会将所有生成中间文件和源代码混在一起,而且cmake生成makefile无法跟踪所有的中间文件,即无法使用”make distclean”命令所有的中间文件删除。...六、在工程中查找并使用其他程序方法 在开发软件时候我们会用到一些函数,这些函数在不同系统中安装位置可能不同,编译时候需要首先找到这些软件包头文件以及链接所在目录以便生成编译选项...例如一个需要使用博克利数据项目,需要头文件db_cxx.h 和链接 libdb_cxx.so ,现在该项目中有一个源代码文件 main.cpp ,放在项目的根目录中。...Findlibdb_cxx.cmake 语法 CMakeLists.txt 相同。这里使用了三个命令: MESSAGE , FIND_PATH 和 FIND_LIBRARY 。.../cmake/modules 中查找 Findlibdb_cxx.cmake ,8-19 行表示查找链接头文件过程。

1.1K60
您找到你想要的搜索结果了吗?
是的
没有找到

【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态打包 | 头文件函数拷贝 | CMake 脚本配置 )

FFMPEG 交叉编译后函数头文件 II . FFMPEG 静态打包动态 ( 做参考 ) III . 创建 Android Studio 工程 IV ....FFMPEG 头文件静态拷贝 V . CMakeList.txt 配置 FFMPEG 头文件 函数 VI . C++ 代码 VII . 博客资源 I ....静态大小说明 : ① 调试信息 : 编译出 6 个静态有 86MB , 这是因为编译时 , 调试信息也包含在里面 , 方便进行调试 ; ② 打包大小 : 最终打包成 APK 之后 , 整个 APK...FFMPEG 头文件静态拷贝 ---- 头文件静态文件拷贝 : 生成 include 和 lib 两个目录 , 拷贝到 app/src/main/cpp 目录下 ; 动态拷贝到 jniLibs...头文件查找路径设置 : 使用 include_directories 指定 FFMPEG 头文件查找目录 , CMAKE_SOURCE_DIR 指的是当前文件地址 ; # IV .

2.3K30

CMake 秘籍(二)

这些限定符具有编译器标志相同含义,正如我们在第一章,从简单可执行文件,第 8 个食谱,控制编译器标志中已经看到使用PRIVATE限定符,编译定义应用于给定目标,而不会被其他消费目标应用...准备工作 C 和 C++程序可以通过包含omp.h头文件并链接正确来访问 OpenMP 功能。编译器根据性能关键部分之前预处理器指令生成并行代码。...使用包供应商提供Config.cmake、ConfigVersion.cmake和Targets.cmake文件,这些文件包本身一起安装在标准位置...我们已经使用find_path来找到头文件完整路径,并使用find_library来找到一个CMake 还提供了find_file、find_program和find_package。...在我们例子中,ZeroMQ 头文件包含版本,可以使用字符串操作和正则表达式提取。 最后,调用find_package_handle_standard_args命令。

41520

CMake简易指南

target产物也在该缓存文件夹平台差分跨平台项目中通常会遇到不同平台参与编译头文件不一样,或者编译选项不同,在 cmake 里有一些描述平台系统变量:CMAKE_SYSTEM_NAME:描述目标平台名称... CMAKE_HOST_SYSTEM_NAME 是不同,正因为编译环境运行环境不同,所以才叫 交叉编译变量以及内置变量为了便于阅读和维护,通常会使用变量来保存一些内容,cmake 中变量分为常规变量...PRIVATE-隐式依赖:表示当前目标生效,依赖目标不生效。INTERFACE:用于INTERFACE类型目标(如:导入库,空),依赖目标生效,继承方式等同PUBLIC。...强烈建议所有编译选项尽可能以target为单位强烈建议所有编译选项尽可能以target为单位强烈建议所有编译选项尽可能以target为单位如 libA 需要 include pathA,且 libA 头文件包含了...表达式支持很多条件,具体参考 cmake-generator-expressions,灵活运用表达式可以让 cmake避免一堆长长if/else,使代码变得非常清晰简洁交叉编译工具链交叉编译本质是使用指定编译器编译生成指定处理器平台中间文件

67350

CMake基础

有时候我们会有多个可执行文件,他们之间用到某些功能是相同,我们想把这些共用功能做成一个,方便大家一起共享 函数可以被可执行文件调用,也可以被其他文件调用 文件又分为静态文件和动态文件...,我们之后会讨论如何使用他人 windows中静态是以.lib 为后缀文件,动态是以.dll 为后缀文件 linux中静态是以.a 为后缀文件,动态是以.so为后缀文件 创建以后,...文件夹下了,里面的 CMakeLists.txt 定义了 hellolib 生成规则 要在根目录使用他,可以用 CMake add_subdirectory 添加子目录,子目录也包含一个 CMakeLists.txt...,其中定义在 add_subdirectory 之后就可以在外面使用 子目录 CMakeLists.txt 里路径名(比如 hello.cpp)都是相对路径,这也是很方便一点 5.子模块头文件处理...头文件搜索目录:(其中第一个 hellolib 是名,第二个是目录) 这样甚至可以用 来引用这个头文件了,因为通过 target_include_directories 指定路径会被视为系统路径等价

1.9K20

CMake打包以及支持find_package

target_include_directories指定了这个要用到头文件,PUBLIC制定包含目录包括了include/子目录和当前CMake二进制目录(为了包含config_impl.hpp...my_library)来链接,并且需要设置include_directories来包含相关头文件,从而能够调用我们。...CMake安装我们需要安装东西包括:头文件,可执行工具以及已经编译好。这些都能够直接使用install()命令来直接安装。...因为其中包含了对于一些宏操作,因此我们需要根据配置不同,这两个文件放在不同位置。但是我们怎么去区分呢?可以使用编译类型${CMAKE_BUILD_TYPE}这个变量。...为了使用导出功能,需要创建一个my_library.cmake文件,其中包含了所有编译和安装目标的引用,用户只需要包含这个文件就可以使用前面编译和安装

28300

面向 C++ 现代 CMake 教程(四)

如果你代码比较瘦,太多包含头文件可能看起来并不是一个大问题。在更大项目中,避免不必要头文件编译节省时间会迅速累积。...}/calc ) 在从src包含列表文件,定义了我们calc目标之后,我们必须配置静态及其公共头文件安装。...为了确保我们包可以被使用,我们创建一个简单项目,包含一个 listfile: chapter-11/08-find-package/CMakeLists.txt cmake_minimum_required...通常,所有包必须为消费项目相同架构构建(执行精确检查)。然而,对于不编译任何内容包(头文件、宏包等),您可以使用ARCH_INDEPENDENT关键词跳过此检查。...就这样——我们包已经完全配置好了。 在下一节中,我们学习什么是组件以及如何将它们一起使用

26600

cmake 简介2021-10-03

可以不用这个环境变量,而在后面直接使用名 第18行用于指定生成文件环境变量TEST_MATH目录下所有文件编译生成.....build,in-source build相对,即将编译输出文件文件放到不同目录中; 三、 基本结构 1,依赖CMakeLists.txt文件,项目主目标一个,主目录中可指定包含子目录...build,in-source build相对,即将编译输出文件文件放到不同目录中; 三、 基本结构 1,依赖CMakeLists.txt文件,项目主目标一个,主目录中可指定包含子目录...在工程中查找并使用其他程序方法 在开发软件时候我们会用到一些函数,这些函数在不同系统中安装位置可能不同,编译时候需要首先找到这些软件包头文件以及链接所在目录以便生成编译选项...在工程中查找并使用其他程序方法 在开发软件时候我们会用到一些函数,这些函数在不同系统中安装位置可能不同,编译时候需要首先找到这些软件包头文件以及链接所在目录以便生成编译选项

30820

CMake 秘籍(五)

这样文件作为目标导出,供第三方项目使用。目标包含版本、配置和位置,即有关目标如何配置和构建完整信息。...文件一样,包含目录、编译定义和选项,当target_link_libraries一起使用时,这些属性含义保持不变: 使用PRIVATE属性,被链接到当前目标,而不会被链接到以它作为依赖其他目标...使用INTERFACE属性,被链接到以当前目标作为依赖目标。 使用PUBLIC属性,将被链接到当前目标以及任何以它作为依赖其他目标。...此外,对PythonLibs搜索要求开发头文件相同主要和次要版本解释器发现版本相同。这是为了确保在整个项目中使用一致解释器和版本。...我们只需要向 Python CFFI 层提供描述 C 接口头文件包含符号共享

41920

使用OSQP解决二次凸优化(QP)问题

很多实际问题进行数学建模,然后转成凸优化问题。这样就能解了。这里说明一下这样思路。 如何解二次凸优化(QP)问题 这里介绍如何使用OSQP进行求解。 我已经依赖合在一起了。...解决措施:cmake升级到3.14版本后可以正常编译。但是sudo apt remove cmake时,把很多ros也删掉了,导致roscore都运行不了。...usr/local/include/OsqpEigen/Constants.hpp:12:18: fatal error: osqp.h: No such file or directory 这是因为头文件包含路径有问题...按下图方式更改osqp-eigen头文件,再重新编译安装。...图片 Solver.tpp文件中对osqp头文件引用要改成下面的方式 #include #include 运行程序链接osqp时报错

2.7K00

CMake 秘籍(六)

准备工作 来自第一章,从简单可执行文件,第三部分,构建和链接共享和静态代码几乎未作改动地被使用:我们添加了对 UUID 依赖。...例如,要安装,我们可以运行以下命令: $ cmake -D COMPONENT=lib -P cmake_install.cmake 由于Message.hpp头文件被设置为项目的公共头文件,我们可以使用...准备工作 我们仍将主要使用上一节相同代码,但我们需要修改src/CMakeLists.txt和Message.hpp头文件。...您可以message源代码您自己代码一起打包,但如果该已经在系统上安装了呢?第八章,超级构建模式,展示了这是一个典型超级构建场景,但您不确定如何安装这样项目。...这些可以在系统中找到mkl.h头文件后设置。这是通过find_path CMake 命令完成

16500

CMake 基础学习

以下列举常用变量: CMAKE_BINARY_DIR: 构建树顶层路径 CMAKE_COMMAND: 指向CMake可执行文件完整路径 CMAKE_CURRENT_BINARY_DIR:... : 表示文件名字 [STATIC | SHARED | MODULE] : 生成文件类型 STATIC 静态,在链接其他目标时使用 SHARED 动态链接,运行时加载 MODULE...指定在编译给定目标时要使用包含目录 # 添加头文件路径,以便查找到头文件 : add_library 创建target名称 或者 add_executable 创建target名称....) // 动态链接或静态链接搜索路径 find_library(Foundation Foundation) add_definitions // 为源文件编译添加由-D引入宏定义。...外,在Release配置下,额外参数 configure_file 文件复制到其他位置并修改其内容。

1.7K40

Cmake大型项目设置指南(更新中)

它是一个可自由使用和自由发布Windows特定头文件使用GNU工具集导入库集合,允许你在GNU/Linux和Windows平台生成本地Windows程序而不需要第三方C运行时。...之后,执行cmake命令就可以一个目录内所有文件编译一遍了。...实际中使用 实际中我们不可能将所有的文件都放到一起,这样会显得很乱,因此我们总会将一些头文件和源文件放在不同文件夹中,甚至多级嵌套也是有可能,这样如果我们还想要将这些文件编译的话就需要在Cmakelist...当然我们可能也需要在工程中链接一些其他动态链接,然后一起编译,这些都是需要通过cmake去显式指定。...cmake使用一些其他大型开源项目(编译好),例如OpenCV,在我们OpenCV编译好之后,如果我们想使用它,我们就可以在cmake中添加: find_package(OpenCV REQUIRED

41740

cmake 添加头文件目录,链接动态、静态

cmake 添加头文件目录,链接动态、静态 cmake 添加头文件目录,链接动态、静态 1. 添加头文件目录INCLUDE_DIRECTORIES 2....添加需要链接文件目录LINK_DIRECTORIES 3. 查找所在目录FIND_LIBRARY 4. 添加需要链接文件路径LINK_LIBRARIES 5....为工程生成目标文件 7.最后贴一个完整例子 参考资料 最近需要将Windows10系统下使用VS2017编译VC++项目放到CentOS Linux服务器上跑,最简单的当然是使用cmake作为项目编译和管理工具了...env目录,而不是常见/usr/、/usr/local等目录,使用cmake进行编译时需要注意头文件文件目录设置。...cmake 添加头文件目录,链接动态、静态 罗列一下cmake常用命令。 CMake支持大写、小写、混合大小写命令。 1.

23.1K11

详细分析一个ROS2 CMakeLists.txt文件

package.xml文件包含该功能包依赖信息,它可以帮助编译工具colcon确定多个功能包编译顺序。当我们需要单独编译功能包时必须确保编译包名必须package.xml文件一致。...可以看到,上面使用了两个不同语句来添加依赖。ament_target_dependencies是官方推荐方式去添加依赖项。它将使依赖项头文件和自身依赖项被正常找到。...通常来说,若依赖项为ROS2功能包时,则使用ament_target_dependencies。若功能包有多个,它也一并包含。...它添加依赖方式上面构建添加依赖方式是一样。...这是必需,这样该使用者也就不必为那些依赖项调用find_package了。

2.2K50

面向 C++ 现代 CMake 教程(三)

,这是非常直接——我们创建了一个shared.h头文件,它在两个单独翻译单元中使用: one.cpp文件,它简单地i打印到屏幕上 two.cpp文件,它除了包含头文件外什么也不做 然后我们这两个文件链接成一个可执行文件...很可能 CMake 作者已经文件 CMake 本身捆绑在一起(这些被称为find-modules,以便配置文件区分开来)。...在已知路径中搜索 PostgreSQL 客户端包含头文件。 检查是否找到了包含头文件;如果是,创建一个IMPORTED目标。...()命令搜索所有已知头文件,这个命令工作方式find_library()非常相似。...正如您所想象,用户更喜欢按名称过滤测试。此选项可用于测试分布到多台机器上,适用于非常大测试套件。 默认情况下,-R一起使用-I选项缩小执行范围(运行同时满足两个要求测试)。

21700

使用CEF(六)— 解读CEFcmake工程配置

STATIC表明希望这个文件编译为静态;SHARED表明希望这个文件编译为动态连接;MODULE表明编译为一个动态,但是通过运行时以程序方式加载(比如dlopen在Unix-like系统中...target_include_directoriestarget_link_libraries 想要构建C/C++工程,我们经常需要在编译阶段使用外部头文件分析依赖内存布局,以及在链接阶段链接这些外部文件...在CMake中,我们一般使用target_include_directories指令来指定对应target编译过程中外部头文件搜索路径,以及使用target_link_libraries指令来指定链接阶段要链接哪些文件...这两个指令命名上没有"target_"前缀,其作用主要是提供全局头文件和链接搜索路径。...这份libcef_dll/CMakeLists.txt主要就是libcef_dll_wrapper各种源码、以及libcef头文件、各种平台特定源代码文件放到一些CMake变量中,最后通过add_library

62320

干活|快速了解如何编写CMakeLists.txt文件

2.1 如果包含OpenCV时 set(OpenCV_DIR "/usr/local/include/opencv3.2.0/share/OpenCV") find_package(OpenCV...2.2 如果包含第三方,该为源码形式(.h和.cpp),非动态链接 ? 此处以在工程中添加词袋DBoW2为例,这里DBoW2是以源码形式包含,也即未编译成.so文件。 ?...2.2.1 包含第三头文件 #设置.h文件对应路径 set( DBoW2_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/ThirdParty/DBow-master/include...为了防止在include层找不到,继续往下一层路径include/DBoW2/路径下查找,这是为了防止某些文件包含路径不一致导致头文件查找错误。 2.2.2 包含第三方cpp文件 ? ?...三 一个简单CMakeLists.txt文件demo 该demo中相较于上述总结添加,还额外包含了DLib

2K10
领券