热门标签 | 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
 


推荐阅读
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社区 版权所有