cmake 之一个小例子
cmake,比手写makefile更好的选择
安装cmake,此部分略过
一、新建一个工程
这里我是在windows下使用eclipse新建了一个c工程(PS:我一般新建一个Makefile类型的工程,这样比较干净)
二、建立必要的文件夹
我的工程目录:
D:\code\cpp\cmakestudy\test>tree /f
卷 软件 的文件夹 PATH 列表
卷***为 0006-17B7
D:.
│ .cproject
│ .project
│ CMakeLists.txt
│
├─bin
├─include
│ sum.h
│
├─lib
└─src
│ CMakeLists.txt
│
├─main
│ CMakeLists.txt
│ main.c
│
└─sum
CMakeLists.txt
sum.c
D:\code\cpp\cmakestudy\test>
bin:用于存放生成的可执行文件
include:存放头文件
lib:存放生成的库文件
src:源代码
三、写源代码
include/sum.h
#ifndef INCLUDE_SUM_H_
#define INCLUDE_SUM_H_
int sum( int a, int b );
#endif /* INCLUDE_SUM_H_ */
src/sum/sum.c
#include"../../include/sum.h"
int sum( int a, int b ){
return a + b;
}
src/main/main.c
#include<stdio.h>
#include"../../include/sum.h"
int main(void){
int a = 0;
int b = 0;
puts("输入两个整数:");
scanf("%d %d",&a,&b);
printf("%d + %d = %d\n",a,b,sum(a,b));
return 0;
}
四、编写CMakeLists.txt
顶层CMakeLists.txt
# 定义工程名称
project(HELLO)
# 定义子目录src,用以递归的调用src中的MakeLists.txt
add_subdirectory(src)
src/CMakeLists.txt
# 定义子目录
add_subdirectory(main)
#定义子目录
add_subdirectory(sum)
src/sum/CMakeLists.txt
# 设置编译器
set(CMAKE_C_COMPILER gcc)
# 源文件列表
set(SRC_LIST sum.c)
# 头文件目录
include_directories(${HELLO_SOURCE_DIR}/include)
# 设置生成的库文件的路径
set(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)
# 生成的库文件
add_library(sum STATIC ${SRC_LIST})
src/main/CMakeLists.txt
# 源文件列表
set(SRC_LIST main.c)
# 头文件列表
include_directories(${HELLO_SOURCE_DIR}/include)
# 设置生成的可执行文件的路径
set(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)
# 生成的可执行文件
add_executable(hello ${SRC_LIST})
# 所需要的库文件的目录
link_directories(${HELLO_SOURCE_DIR}/lib)
# 需要链接的库文件
target_link_libraries(hello sum)
五、使用cmake生成Makefile
在项目中新建一个build目录,现在的项目目录:
D:\code\cpp\cmakestudy\test>tree /f
卷 软件 的文件夹 PATH 列表
卷***为 0006-17B7
D:.
│ .cproject
│ .project
│ CMakeLists.txt
│
├─bin
├─build
├─include
│ sum.h
│
├─lib
└─src
│ CMakeLists.txt
│
├─main
│ CMakeLists.txt
│ main.c
│
└─sum
CMakeLists.txt
sum.c
D:\code\cpp\cmakestudy\test>
执行cmkae命令:
D:\code\cpp\cmakestudy\test\build>cmake .. -G"MinGW Makefiles"
-- The C compiler identification is GNU 4.7.1
-- The CXX compiler identification is GNU 4.7.1
-- Check for working C compiler: D:/program/cpp/MinGW/bin/gcc.exe
-- Check for working C compiler: D:/program/cpp/MinGW/bin/gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: D:/program/cpp/MinGW/bin/g++.exe
-- Check for working CXX compiler: D:/program/cpp/MinGW/bin/g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Warning (dev) in CMakeLists.txt:
No cmake_minimum_required command is present. A line of code such as
cmake_minimum_required(VERSION 3.1)
should be added at the top of the file. The version specified may be lower
if you wish to support older CMake versions for this project. For more
information run "cmake --help-policy CMP0000".
This warning is for project developers. Use -Wno-dev to suppress it.
-- Configuring done
-- Generating done
-- Build files have been written to: D:/code/cpp/cmakestudy/test/build
D:\code\cpp\cmakestudy\test\build>
现在的项目目录:
D:\code\cpp\cmakestudy\test>tree /f
卷 软件 的文件夹 PATH 列表
卷***为 0006-17B7
D:.
│ .cproject
│ .project
│ CMakeLists.txt
│
├─bin
├─build
│ │ CMakeCache.txt
│ │ cmake_install.cmake
│ │ Makefile
│ │
│ ├─CMakeFiles
│ │ │ cmake.check_cache
│ │ │ CMakeDirectoryInformation.cmake
│ │ │ CMakeOutput.log
│ │ │ Makefile.cmake
│ │ │ Makefile2
│ │ │ progress.marks
│ │ │ TargetDirectories.txt
│ │ │
│ │ ├─3.1.0
│ │ │ │ CMakeCCompiler.cmake
│ │ │ │ CMakeCXXCompiler.cmake
│ │ │ │ CMakeDetermineCompilerABI_C.bin
│ │ │ │ CMakeDetermineCompilerABI_CXX.bin
│ │ │ │ CMakeRCCompiler.cmake
│ │ │ │ CMakeSystem.cmake
│ │ │ │
│ │ │ ├─CompilerIdC
│ │ │ │ a.exe
│ │ │ │ CMakeCCompilerId.c
│ │ │ │
│ │ │ └─CompilerIdCXX
│ │ │ a.exe
│ │ │ CMakeCXXCompilerId.cpp
│ │ │
│ │ └─CMakeTmp
│ └─src
│ │ cmake_install.cmake
│ │ Makefile
│ │
│ ├─CMakeFiles
│ │ CMakeDirectoryInformation.cmake
│ │ progress.marks
│ │
│ ├─main
│ │ │ cmake_install.cmake
│ │ │ Makefile
│ │ │
│ │ └─CMakeFiles
│ │ │ CMakeDirectoryInformation.cmake
│ │ │ progress.marks
│ │ │
│ │ └─hello.dir
│ │ build.make
│ │ C.includecache
│ │ cmake_clean.cmake
│ │ depend.internal
│ │ depend.make
│ │ DependInfo.cmake
│ │ flags.make
│ │ includes_C.rsp
│ │ link.txt
│ │ linklibs.rsp
│ │ objects.a
│ │ objects1.rsp
│ │ progress.make
│ │
│ └─sum
│ │ cmake_install.cmake
│ │ Makefile
│ │
│ └─CMakeFiles
│ │ CMakeDirectoryInformation.cmake
│ │ progress.marks
│ │
│ └─sum.dir
│ build.make
│ C.includecache
│ cmake_clean.cmake
│ cmake_clean_target.cmake
│ depend.internal
│ depend.make
│ DependInfo.cmake
│ flags.make
│ includes_C.rsp
│ link.txt
│ progress.make
│
├─include
│ sum.h
│
├─lib
└─src
│ CMakeLists.txt
│
├─main
│ CMakeLists.txt
│ main.c
│
└─sum
CMakeLists.txt
sum.c
D:\code\cpp\cmakestudy\test>
六、执行make,并运行程序
make:
D:\code\cpp\cmakestudy\test\build>make
Scanning dependencies of target sum
[ 50%] Building C object src/sum/CMakeFiles/sum.dir/sum.obj
Linking C static library ..\..\..\lib\libsum.a
[ 50%] Built target sum
Scanning dependencies of target hello
[100%] Building C object src/main/CMakeFiles/hello.dir/main.ob
Linking C executable ..\..\..\bin\hello.exe
[100%] Built target hello
D:\code\cpp\cmakestudy\test\build>
现在的项目目录:
D:\code\cpp\cmakestudy\test>tree /f
卷 软件 的文件夹 PATH 列表
卷***为 0006-17B7
D:.
│ .cproject
│ .project
│ CMakeLists.txt
│
├─bin
│ hello.exe
│
├─build
│ │ CMakeCache.txt
│ │ cmake_install.cmake
│ │ Makefile
│ │
│ ├─CMakeFiles
│ │ │ cmake.check_cache
│ │ │ CMakeDirectoryInformation.cmake
│ │ │ CMakeOutput.log
│ │ │ Makefile.cmake
│ │ │ Makefile2
│ │ │ progress.marks
│ │ │ TargetDirectories.txt
│ │ │
│ │ ├─3.1.0
│ │ │ │ CMakeCCompiler.cmake
│ │ │ │ CMakeCXXCompiler.cmake
│ │ │ │ CMakeDetermineCompilerABI_C.bin
│ │ │ │ CMakeDetermineCompilerABI_CXX.bin
│ │ │ │ CMakeRCCompiler.cmake
│ │ │ │ CMakeSystem.cmake
│ │ │ │
│ │ │ ├─CompilerIdC
│ │ │ │ a.exe
│ │ │ │ CMakeCCompilerId.c
│ │ │ │
│ │ │ └─CompilerIdCXX
│ │ │ a.exe
│ │ │ CMakeCXXCompilerId.cpp
│ │ │
│ │ └─CMakeTmp
│ └─src
│ │ cmake_install.cmake
│ │ Makefile
│ │
│ ├─CMakeFiles
│ │ CMakeDirectoryInformation.cmake
│ │ progress.marks
│ │
│ ├─main
│ │ │ cmake_install.cmake
│ │ │ Makefile
│ │ │
│ │ └─CMakeFiles
│ │ │ CMakeDirectoryInformation.cmake
│ │ │ progress.marks
│ │ │
│ │ └─hello.dir
│ │ build.make
│ │ C.includecache
│ │ cmake_clean.cmake
│ │ depend.internal
│ │ depend.make
│ │ DependInfo.cmake
│ │ flags.make
│ │ includes_C.rsp
│ │ link.txt
│ │ linklibs.rsp
│ │ main.obj
│ │ objects.a
│ │ objects1.rsp
│ │ progress.make
│ │
│ └─sum
│ │ cmake_install.cmake
│ │ Makefile
│ │
│ └─CMakeFiles
│ │ CMakeDirectoryInformation.cmake
│ │ progress.marks
│ │
│ └─sum.dir
│ build.make
│ C.includecache
│ cmake_clean.cmake
│ cmake_clean_target.cmake
│ depend.internal
│ depend.make
│ DependInfo.cmake
│ flags.make
│ includes_C.rsp
│ link.txt
│ progress.make
│ sum.obj
│
├─include
│ sum.h
│
├─lib
│ libsum.a
│
└─src
│ CMakeLists.txt
│
├─main
│ CMakeLists.txt
│ main.c
│
└─sum
CMakeLists.txt
sum.c
D:\code\cpp\cmakestudy\test>
执行程序:
D:\code\cpp\cmakestudy\test\bin>hello.exe
输入两个整数:
2 3
2 + 3 = 5
D:\code\cpp\cmakestudy\test\bin>
七、cmake总结
1、关于项目目录结构
我其实并不太了解C/C++项目应该有什么样的目录结构,不过我在找cmake的资料的时候,看到的项目目录结构都差不多有include,src,bin,build这几个目录。然后不同的模块放到src下不同的目录中。
对于我来说,还远远没有到那种分模块开发、测试的水平,第三方库也不会几个,但是之后会按照这个目录结构学下去,也建议各位在写C/C++程序的时候注意目录结构。
2、顶层的CMakeLists.txt
对于这个小例子来说,这一个CMakeLists.txt其实就两个作用。一是定义程序的名称,二是定义子目录。
project(HELLO)这一句还隐式的定义了两个cmake变 量:<projectname>_BINARY_DIR以及<projectname>_BINARY_DIR,这里就是 HELLO_BINARY_DIR和HELLO_SOURCE_DIR,两个变量指的都是当前工程的路径。
add_subdirectory(src),定义当前目录包含的子目录,以调用其子目录中的CMakeLists.txt。其实看目录结果就应该能看出来,对于含有包含CMakeLists.txt子目录的目录来说,其CMakeLists.txt都应该有若干add_subdirectory(src)。
3、src中每个模块的CMakeLists.txt
必不可少的部分有:
源文件列表,头文件所在目录,生成的库文件的路径和名字,如果需要链接其它库文件,如各种第三方库,则需要给出第三方库的头文件所在目录和库文件。
4、主函数所在文件夹的CMakeLists.txt
和每个模块都差不多,只是多了关于可执行文件生成的目录和名字。
PS:关于所需库的目录和库文件名这一部分,需要写到最后,否则会出问题,暂时不知原因。
5、下一步学习cmake的目标
a.cmake命令,包括学会常用的命令、关于项目设置比如生成安装程序,doc文档等
b.第三方库,要做一到这一步,就需要先会使用第三方库,如gtk+,libxml等
八、参考:
http://www.cppblog.com/Roger/archive/2011/11/17/160368.html
http://blog.csdn.net/dbzhang800/article/details/6314073
转载于:https://my.oschina.net/iamhere/blog/489838