热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cmake语法详解,cmake详细教程

1.编译单目录工程1.创建工程文件夹mkdirhello#工程目录cdhellomkdirsrc#存放源代码的目录mkdirbuild#存放编译中间代码和


1 .编译单目录工程1 .创建工程文件夹


mkdir hello #工程目录cd hellomkdir src #源代码所在的目录mkdir build #编译中间代码和目标代码所在的目录2.src目录,main.c


#includestdio.hintmain(intargc,char **argv ) printf(Helloworld(n ); 返回0; }3. cmake lists.txt创建工程顶层目录


cmake _ minumum _ required (版本2.6 )指定项目名称项目(hello )指定子目录add _ subdirectory (src )4.子目录src的cmmc


aux_source_directory(.src_list ) add_executable ) Hello${src_list} )5.编译工程


进入build目录


2 .运行命令cmake并创建makefile


3 .执行命令make编译工序


在build的子目录src中生成了可执行文件


2 .编译多目录工程1 .建立工程目录


mkdir hello #工程目录cd hellomkdir src #源代码目录mkdir build #编译生成的中间文件cd src mkdir hello #存储hello模块mkdir world #


进入hello目录创建hello.h文件


# ifndef hello _ h # define hello _ hvoidhello _ print (void ); #endif创建hello.c文件


# include ' hello.h ' # include stdio.hvoidhello _ print (void ) {printf ) hello; 创建CMakeLists.txt文件


创建aux _ source _ directory (.dir _ hello _ src ) add_library ) hello_lib${dir_hello_src} ) world模块


访问world目录以创建world.h文件


# ifndef world _ h # define world _ hvoidworld _ print (void ); #endif创建world.c文件


# include ' world.h ' # include stdio.hvoidworld _ print (void ) {printf ) world; 创建CMakeLists.txt文件


aux _ source _ directory (.dir _ world _ src ) add_library ) world_lib${dir_world_src} )4.创建主模块


进入src目录创建main.c文件


# include ' hello/hello.h ' # include ' world/world.h ' int main (int argc,char **argv ) { Hello_Print; World_Print (; return0}创建cmake lists.txt文件


add_source_directory(.dir_src )子目录add_subdirectory ) hello ) add _ subdirectory (world ) #可执行文件add _ src


cmake _ minumum _ required (版本2.6 )项目) Hello_prj ) add_subdirectory ) src )3.构建和使用动态和静态库1.1个HDD


TD bwb|--hello|--hello.c|`-- world|`-- world.c `-- test|--cmake lists.txt `-- mytest.c2.


cake _ minimum _ required (2.6版项目) helloworld )库文件存储库的路径set (library _ output _ path $ { project }

E_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/sdyc) #获取当前目录及子目录(递归获取),添加到头文件搜索路径 function(include_sub_directories_recursively root_dir) if (IS_DIRECTORY ${root_dir}) # 当前路径是一个目录吗,是的话就加入到包含目录 message("include dir: " ${root_dir}) include_directories(${root_dir}) endif() file(GLOB ALL_SUB RELATIVE ${root_dir} ${root_dir}/*) # 获得当前目录下的所有文件,让如ALL_SUB列表中 foreach(sub ${ALL_SUB}) if (IS_DIRECTORY ${root_dir}/${sub}) include_sub_directories_recursively(${root_dir}/${sub}) # 对子目录递归调用,包含 endif() endforeach() endfunction() #项目的所有目录都为头文件搜索路径 include_sub_directories_recursively(${PROJECT_SOURCE_DIR}) #添加库文件搜索路径 link_directories( ${PROJECT_SOURCE_DIR}/build/lib ) #添加子目录 add_subdirectory(src) add_subdirectory(test) #设置安装目录 set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/install)

3.helloworld库的源代码
hello.h文件

 

#ifndef HELLO_H#define HELLO_Hvoid Hello_Print(void);#endif

hello.c文件

 

#include "hello/hello.h"#include void Hello_Print(void){ printf("hello ");}

world.h文件

 

#ifndef WORLD_H#define WORLD_Hvoid World_Print(void);#endif

world.c文件

 

#include "world/world.h"#include void World_Print(void){ printf("world");}

4.子目录src下的CMakeLists.txt

 

#递归获取当前目录及子目录下的所有c文件 file(GLOB_RECURSE c_files "*.c") #生成动态库和静态库 add_library(helloworld_lib_shared SHARED ${c_files}) add_library(helloworld_lib_static STATIC ${c_files}) #将动态库和静态库的名字设置为一致 set_target_properties(helloworld_lib_shared PROPERTIES OUTPUT_NAME "helloworld") set_target_properties(helloworld_lib_static PROPERTIES OUTPUT_NAME "helloworld") #设置动态库版本 set_target_properties(helloworld_lib_shared PROPERTIES VERSION 1.2 SOVERSION 1) #安装动态库和静态库 INSTALL(TARGETS helloworld_lib_shared helloworld_lib_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) #安装头文件 INSTALL(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION include)

5.mytest.c文件测试生成的库文件
mytest.c文件

 

#include "hello/hello.h"#include "world/world.h"#include int main(int argc, char **argv){ Hello_Print(); World_Print(); printf("\n"); return 0;}

CMakeLists.txt文件

 

#递归获取所有当前目录及子目录下的C文件file(GLOB_RECURSE c_files ./*.c) #生成执行文件add_executable(mytest ${c_files}) #链接外部库target_link_libraries(mytest libhelloworld.so)

6.构建工程

 

1.进入目录build2.执行命令: cmake ..3.执行命令: make4.执行命令: make install 4. 指定编译器和编译选项

1.CMAKE_C_COMPILER: 指定C编译器
2.CMAKE_CXX_COMPILTER:指定C++编译器
3.CMAKE_C_FLAGS: 指定C编译选项
4.CMAKE_CXX_FLAGS:指定C++编译选项
5.EXECUTABLE_OUTPUT_PATH: 指定执行文件存放目录
6.LIBRARY_OUTPUT_PATH: 指定库文件存放目录
7.CMAKE_BUILD_TYPE:指定build类型[Debug|Release]
8.BUILD_SHARED_LIBS: 指定默认库编译方式[OFF|ON]

上述内部变量使用说明:
1.CMakeLists.txt文件上使用set命令
2.cmake 命令中指定,如: cmake -DCMAKE_C_COMPILER=gcc

add_definitions:添加编译参数

5. 配置编译模块 6. CMake 常用变量和语句

1.include_directories:指定头文件搜索路径
2.link_directories:指定库文件搜索路径
3.add_subdirectory:添加子目录
4.target_link_libraries:指定文件链接库文件


作者:LGmark
链接:https://www.jianshu.com/p/8df5b2aba316
 


推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Linux 程序设计学习笔记----动手编写makefile文件
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 32位ubuntu编译android studio,32位Ubuntu编译Android 4.0.4问题
    问题一:在32位Ubuntu12.04上编译Android4.0.4源码时,出现了关于emulator的错误,关键是其Makefile里的 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 源码安装Nginx 解决报错
    CentOS8源码安装Nginx编译安装注意事项如果安装时不是使用的默认路径,则必须要修改PATH环境变量,以能够识别此程序的二进制文件路径 ... [详细]
author-avatar
宝宝贝贝侠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有