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

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

当我们将一些lib安装在非默认搜索路径时,cmake就没法搜索到了,可设置: SET(CMAKE_INCLUDE_PATH "include_path") // find_path,查找头文件 SET(...ADD_LIBRARY编译一个动/静态库或者模块,设定的名字需在整个工程中是独一无二的,而且在整个同一个工程中,跟父子文件夹路径无关,我们便可以通过TARGET_LINK_LIBRARIES依赖该模块。...4.5 功能模块添加 4.5.1 功能模块编译 比如我们要添加一个日志模块,实现对spdlog项目的一个二次封装,更好的在自己的项目中使用,那么我们建立src/logger目录,里面新建logger.hpp...我们安装需求是: src目录下的每个模块头文件都能够安装,并按原目录存放安装 库文件安装放于lib目录下 可执行文件包括测试文件放于bin目录 首先模块头文件的安装实现均在src/{module}/CMakeLists.txt...5 总结 “工欲善其事,必先利其器”,把基础筑好,在软件开发过程中也是很重要的,就如项目中需求明确一样,本篇文章我把C/C++项目开发的整体框架形成一个模板,不断总结改进,方便后续类似项目的快速开发。

8.5K52

CMake基础

链接库文件查找位置顺序: Windows:可执行文件同目录,其次是环境变量%PATH% Linux:ELF格式可执行文件的RPATH,其次是/usr/lib等 3.CMake生成静态库和动态库 CMake...,我们之后会讨论如何使用他人的库 windows中静态库是以.lib 为后缀的文件,动态库是以.dll 为后缀的文件 linux中静态库是以.a 为后缀的文件,动态库是以.so为后缀的文件 创建库以后,...的含义稍后会说明(CMake 中有很多这样的大写修饰符) 4.CMake中的子模块 复杂的工程中,我们需要划分子模块,通常一个库一个目录,比如: 这里我们把 hellolib 库的东西移到 hellolib...,其中定义的库在 add_subdirectory 之后就可以在外面使用 子目录的 CMakeLists.txt 里路径名(比如 hello.cpp)都是相对路径,这也是很方便的一点 5.子模块头文件的处理...以及可以通过下列指令(不推荐使用),把选项加到所有接下来的目标去: include_directories(/opt/cuda/include) # 添加头文件搜索目录 link_directories

1.9K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    thinkphp框架解析0 -- 起源

    、函数和类文件还有行为扩展,这些文件散布在框架的各个地方。...系统自定义的行为保存在$mode['tags']中,用户自定义的行为应该保存在Application/Common/tags.php。tags.php文件写法有坑,后面会讲到。...如果考虑到程序不仅仅面向中文使用者,那么一定要注意国际化的问题。DEFAULT_LANG的默认值记录在ThinkPHP/Conf/convention.php中。...以上提到这些信息组成了TP运行的基本运行环境,在非DEBUG模式下,TP会把以上信息带上命名空间都写入缓存文件里以提高性能。...而如果程序运行在DEBUG模式下,则会多读取一个文件,当然是DEBUG的配置文件了,他位于ThinkPHP/Conf/debug.php,如果想在自己的项目中修改某些DEBUG配置,使用者可以在Application

    1.2K20

    Linux基础——gcc编译、静态库与动态库(共享库)

    1、静态库的命名格式 lib + 库的名字 + .a 例:libMyTest.a (MyTest为静态库的名字) 2、静态库作用分析 在项目开发过程中,经常出现优秀代码重用现象,又或者提供给第三方功能模块却又不想让其看到源代码...,这些时候,通常的做法是将代码封装成库或者框架,生成的静态库要和头文件同时发布。...优点: 寻址方便,速度快 库在链接时被打包到可执行文件中,直接发布可执行程序即可以使用 缺点: 静态库的代码被加载到可执行程序中,因此体积过大 如果静态库的函数发生改变,必须重新编译可执行程序 3、静态库的制作与使用...测试代码的目录结构如上图所示,include中存放的是头文件,lib中存放的是静态(动态)库,src中存放的是源代码,main.c是发布代码。.../lib 将静态库文件放置lib文件夹下 nm libMyTest.a 查看库中包含的函数等信息 第三步:使用静态库 第一种方法: gcc + 源文件 +

    8.7K40

    Hello Qt——QMake用户指南

    在简单工程中,最常使用的函数是使用一个文件名作为参数的include函数。在工程文件中,给定文件的内容会被包含在include函数调用的位置。include函数最常用于包含其它工程文件.pro。...例如,在一个工程目录使用下列命令可以从一个二进制包生成Makefile文件: qmake -spec macx-g++ B、框架使用 qmake会自动生成链接框架的构建规则,这些框架的标准框架路径在Mac...LIBS += -framework #TheFramework C、创建框架 任何给定的库项目都可以被配置,以便生成的库文件放置在准备部署的框架中。...A、处理静态数据 如果应用程序使用了任何静态数据,构建系统需要了解这些静态数据。这是因为Symbian系统会试图在没有使用静态数据的情况下节省内存。...在安装此库时,通过将其指定为INSTALLS声明中的目标,qmake将自动将.prl文件拷贝到安装路径。 B、在使用静态库的应用程序中读取该元信息。

    6.4K20

    (转载非原创)从新建文件夹开始构建UtopiaEngine(2)

    ,分别对应不同的提示颜色,你可以增加类型并自定义颜色,而且你甚至可以不仅让日志输出在控制台上,你也可以让它输出在任何你想要的界面上,不过鉴于本人技术力太过生草以及本引擎的体量,使用默认的设置就足以完成我们的需求...(切记一定要将各个模块最终生成的二进制文件(.lib .dll .exe)均放在同一个文件夹内,premake5中的复制命令也可以完成,具体做法请参考上一篇) 2.1.2 编写 在继续之前请为应用程序和引擎核心模块添加依赖项...: // 由于日志系统的代码可以说几乎在引擎中的所有地方都会调用,如果使用非静态成员,那每次调用都要在相应类中 // 设定一个日志类的成员对象,浪费了内存资源不说,可能还会造成不可必要的麻烦...// 其实关于这个还有一个更好的方法:将本模块转为静态库(.lib),这样便减少了模块调用之间的麻烦关系与限制。...// 而且本模块并复杂,所以以静态库的形式在程序运行时就装载进内存对效率的影响影响不算大 // 具体方法具体选择,大家可以尝试用静态库包装本模块。

    86100

    C语言程序设计核心详解 第七章 函数和预编译命令

    第七章 函数和预编译命令1.函数的定义和使用1.1 函数定义C语言程序的框架有两种:一个main()单框架一个main()+多个子函数注:一个源程序文件可由一个或多个函数组成一个C语言程序可以由一个或多个源程序文件组成...在同一文件中若全局变量和局部变量同名,局部变量屏蔽全局变量例:#includeint a,b;void fun(){a=100;b=200;}main(){int a=5,b=7;fun...在做题的过程中,static可以用方框圈起2.3.3 register类别变量a.register类别只能是局部变量才能被说明b.一般不能直接使用2.3.4 extern类别变量a.extern类别变量可以加大变量的作用范围...#undef命令可以提前终止宏名的作用域。在进行宏定义时,可以引用已经定义的宏名进行层层置换在进行宏替换时,必须先替换完所有的宏后再运算,同时替换过程中不能乱加括号。...注意这种格式,是原模原样替换,就原模原样的替换,然后再计算注:(1)在定义有参宏时,参数列表必须用一对小括号且小括号和宏名不能有空格(2)对有参宏名进行替换时,需要将形参改成相应的实参,并且注意分清形参和实参的对应关系

    24410

    thinkjs学习笔记

    ,应用配置的路径是App/Conf/config.js, 配置在程序中是很方便读取和写入的 //读取 var dbHost = C('db_host'); //写入 C('name', 'xxx');.../Conf/tag.js中自定义标签 ): /** * 系统标签配置 * 可以在App/Conf/tag.js里进行修改 * @type {Object} */ module.exports =.../Socket Socket驱动 lib/Lib/Driver/Template 模版引擎驱动 如果有些功能框架里还没实现,如:mssql数据库,那么开发人员可以在项目里 App/Lib/Driver/...自动加载 这里有thinkjs框架里面的文件,可以使用thinkRequire加载,非thinkjs里面的文件内部仍然是使用系统的require来加载 可以快速加载的xxxBehavior, xxxModel...,即可以按照/分组/控制器/操作/的方式来分割参数了,如果第一个路净值在分组列表中不存在,则第一个路径的值是分配到控制器上面。

    89120

    thinkjs学习笔记

    ,应用配置的路径是App/Conf/config.js, 配置在程序中是很方便读取和写入的 //读取 var dbHost = C('db_host'); //写入 C('name', 'xxx');.../Conf/tag.js中自定义标签 ): /** * 系统标签配置 * 可以在App/Conf/tag.js里进行修改 * @type {Object} */ module.exports =.../Socket Socket驱动 lib/Lib/Driver/Template 模版引擎驱动 如果有些功能框架里还没实现,如:mssql数据库,那么开发人员可以在项目里 App/Lib/Driver/...自动加载 这里有thinkjs框架里面的文件,可以使用thinkRequire加载,非thinkjs里面的文件内部仍然是使用系统的require来加载 可以快速加载的xxxBehavior, xxxModel...,即可以按照/分组/控制器/操作/的方式来分割参数了,如果第一个路净值在分组列表中不存在,则第一个路径的值是分配到控制器上面。

    1.2K71

    CTK完整教程(OSGI for C++ 实现 C++ Qt 模块化)

    CTK框架实际应用比较可靠,但网上资料很少。本教程围绕 CTK Plugin Framework,探索 C++ 中的模块化技术,并能够基于 CTK 快速搭建 C++ 组件化框架,避免后来的人走弯路。...为了启用动态(非持久性)服务,Qt Mobility 服务框架可以与 Service Registry 一起使用,类似于 OSGi Core Specifications 中描述的一样。...非侵入 在一个 CTK 插件环境中,不同插件均有自己的环境。它们可以使用任何设施,框架对此并无限制。...每个插件都有自己的注册器Activator,功能节接口完成后,在插件启动时注册到ctk框架的服务中,代码如下:hello_activator.cpp #include "hello_activator.h...服务工厂的作用: 在服务中可以知道是哪个其他插件在使用它; 懒汉式使用服务,需要的时候才new; 其他插件使用有服务工厂和使用无服务工的服务,没有任何区别,代码都一样; 可根据需要创建多种实现的服务,就是

    8K13

    IOS静态代码扫描--分析与总结

    IOS静态代码扫描--分析与总结 为了进一步加强代码质量,规范并减少代码缺陷,静态代码扫描是上过环节中必不可少的一部分。大多数都希望通过不同的途径提前发现日常测试中难发现的问题。...但这里要注意的是Coverity检测是收费的。 2、clang Clang作为LLVM编译器框架的前端,最主要的任务是词法分析、语法分析,中间代码生成。...-configuration Developer (4)可以看到生成报告在指定目录下 3、infer Infer是Facebook开源的用来执行增量分析的一款静态分析工具,由OCaml语言编写的infer...之后想要自定义规则,但是方法三又太麻烦了,于是我就偷懒从网上下载了别人事先编译好的oclint-0.12(这里说的"编译好的oclint"保留了当初编译的“现场”,可以进行自定义规则,而方法二中的是“干净...说明:在xcode9中,Aggregate类型在Cross-platform等目录下(而非iOS、watchOS、macOS等目录下)。

    4.8K21

    Android Studio Gradle文件解释其作用

    AndroidStudio使用Gradle作为构建工具,是构建工具就必须管理依赖库,当工程中使用了开源库时只需在build.gradle中告知gradle从哪个远程库下载就可以了。...由于其运行在 JVM 上的特性,Groovy也可以使用其他非Java语言编写的库。 ● 是一个基于 Java虚拟机的敏捷 动态语言。...Project的settings.gradle include ':app' 位于工程的根目录,用于指示 Gradle 在构建应用时应将哪些模块包括在内,当然一个工程可以包含多个moudle,若还有一个...lib moudle ,settings.gradle则如下: include ':app', ':lib' Project的build.gradle 位于工程的跟目录,指定Gradle构建所引用的仓库和依赖的插件...若工程某个模块中不依赖这里定义的远程仓库,则需在模块的build.gradle中申明 **/ allprojects { repositories { jcenter()

    9810

    CMake学习笔记(三)——以笔者的Robosub竞赛为例

    笔者在2016年作为团队的图像及总控负责人,2017年作为团队的技术顾问。 由于2016年团队的控制系统仍有很大的改进空间,所以笔者就写了新的软件框架,主要思想基于多进程通信。 2....文件列表 在该CMake项目下使用Linux的tree指令,得到如下的文件列表: . ├── CMakeLists.txt ├── CustomizeFunctions │ ├── CMakeLists.txt...其中, /usr/local/share/OpenCV/ 是笔者在使用源码编译安装OpenCV时设置的安装地址OpenCV_INSTALL_DIR。...,所以加上前缀lib,后缀.so,完整的库文件名称应该为libcontours_fun.so SHARED:生成库的属性为共享库;此处若为STATIC则为静态库 ${LIB_CONTOUR_SOURCE...生成图像客户端目标文件,是基于之前自定义函数部分中的imageprocessing_fun的图像处理函数的,而之前这些函数已经被处理为库文件,被存储在工程生成路径下的lib路径中,所以指令LINK_DIRECTORIES

    1.3K100

    tp5源码解析--自动加载类

    在TP5的框架使用过程中,自动加载类是可能会接触到,上手不难,但若想随心所欲的用,还是需要了解一番。...用了千次,却没看过一次源码,学习源码,起码对TP5这个框架使用更加得心应手,毕竟技术服务于业务,能够写出更简介、更方便、更有效的业务代码,本身就是一件身心愉悦的事儿; 自动加载流程 第一步,TP框架初始化...Loader会走如下逻辑; 加载autoload_static.php中的 prefixLengthsPsr4和prefixDirsPsr4两个数组; public static $prefixLengthsPsr4...'/application', ), ); 再通过self::${$attr} = $composerClass::${$attr} 变成当前类的静态数组; 详细逻辑如下:...'files'] as $attr) { if (property_exists($composerClass, $attr)) { //转化成自己类的静态数组

    38110

    tp5源码解析--自动加载类

    在TP5的框架使用过程中,自动加载类是可能会接触到,上手不难,但若想随心所欲的用,还是需要了解一番。...用了千次,却没看过一次源码,学习源码,起码对TP5这个框架使用更加得心应手,毕竟技术服务于业务,能够写出更简介、更方便、更有效的业务代码,本身就是一件身心愉悦的事儿; 自动加载流程 第一步,TP...框架初始化 Loader会走如下逻辑; 加载autoload_static.php中的 prefixLengthsPsr4和prefixDirsPsr4两个数组; public static $prefixLengthsPsr4...'/application', ), ); PHP Copy 再通过self::${$attr} = $composerClass::${$attr} 变成当前类的静态数组; 详细逻辑如下...'files'] as $attr) { if (property_exists($composerClass, $attr)) { //转化成自己类的静态数组

    26820

    教你理清SpringBoot与SpringMVC的关系

    你可以设置spring.resources.staticLocations属性自定义静态资源的位置(配置一系列目录位置代替默认的值),如果你这样做,默认的欢迎页面将从自定义位置加载,所以只要这些路径中的任何地方有一个.../ spring.resources.chain.strategy.fixed.version=v12 使用以上策略,JavaScript模块加载器加载"/js/lib/"下的文件时会使用一个固定的版本策略...查看ResourceProperties获取更多支持的选项。 欢迎页面 Spring Boot支持静态和模板欢迎页面。它首先index.html在配置的静态内容位置中查找 文件。...如果找到任何一个,它将自动用作应用程序的欢迎页面。、 自定义Favicon Spring Boot favicon.ico在配置的静态内容位置和类路径的根目录(按此顺序)中查找a 。...使用以上引擎中的任何一种,并采用默认配置,则模块会从src/main/resources/templates自动加载。

    2.3K40

    手把手教你如何在Android下进行JNI开发(入门)

    (3)LOCAL_MODULE:调用的库名,用来区分android.mk中的每一个模块。文件名必须是唯一的,不能有空格。注意,这里编译器会为你自动加上一些前缀lib和后缀.so,来保证文件是一致的。...6.在模块的build.gradle中设置so文件路径 sourceSets { main { jni.srcDirs = [] jniLibs.srcDirs...# TODO include_directories( src/main/jniLibs/${ANDROID_ABI}/include ) # TODO 路径指向上面会编译出错(无法在jniLibs中引入...JNI常见用法 1、jni访问java非静态成员变量 1.使用 GetObjectClass、 FindClass获取调用对象的类 2.使用 GetFieldID获取字段的ID。...3、jni调用java非静态成员方法 1.使用 GetObjectClass、 FindClass获取调用对象的类 2.使用 GetMethodID获取方法的ID。这里需要传入方法的签名描述。

    4.5K10

    教你理清SpringBoot与SpringMVC的关系

    你可以设置spring.resources.staticLocations属性自定义静态资源的位置(配置一系列目录位置代替默认的值),如果你这样做,默认的欢迎页面将从自定义位置加载,所以只要这些路径中的任何地方有一个.../   spring.resources.chain.strategy.fixed.version=v12  使用以上策略,JavaScript模块加载器加载"/js/lib/"下的文件时会使用一个固定的版本策略...查看ResourceProperties获取更多支持的选项。 欢迎页面 Spring Boot支持静态和模板欢迎页面。它首先index.html在配置的静态内容位置中查找 文件。...如果找到任何一个,它将自动用作应用程序的欢迎页面。、 自定义Favicon Spring Boot favicon.ico在配置的静态内容位置和类路径的根目录(按此顺序)中查找a 。...使用以上引擎中的任何一种,并采用默认配置,则模块会从src/main/resources/templates自动加载。

    1.7K30
    领券