作者:宝宝贝贝侠 | 来源:互联网 | 2023-10-12 13:34
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