1 简单的可执行文件生成工程
1.1 源文件
main.cpp
#include <stdio.h>int main(int argc, char *argv[]){ printf("Hello CMake!/n"); return 0;}
1.2 CMakeLists.txt文件
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(Test1)SET(SRC_LIST main.cpp)MESSAGE(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})MESSAGE(STATUS "This is SOURCE dir " ${PROJECT_SOURCE_DIR})ADD_EXECUTABLE(HelloCMake ${SRC_LIST})
2 只单独生成静态库和动态库
2.1 工程目录
.├── build├── CMakeLists.txt├── include│ └── mymath.h└── src └── mymath.c
2.2 工程文件
mymath.h
int add(int a, int b);int sub(int a, int b);
mymath.c
int add(int a, int b){ return a + b;}int sub(int a, int b){ return a - b;}
2.3 CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(Test2) SET(CMAKE_C_FLAGS "$ENV{CFLAGS} -O3 -Wall") SET(INCLUDE_PATH ${PROJECT_SOURCE_DIR}/include) MESSAGE(STATUS "Include Path, ${INCLUDE_PATH}") SET(SOURCE_PATH ${PROJECT_SOURCE_DIR}/src) MESSAGE(STATUS "Source Path , ${SOURCE_PATH}") INCLUDE_DIRECTORIES(${INCLUDE_PATH}) AUX_SOURCE_DIRECTORY(${SOURCE_PATH} SRC_LIST) SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) MESSAGE(STATUS "Library Output Path, " ${PROJECT_BINARY_DIR/lib}) ADD_LIBRARY(mymath SHARED ${SRC_LIST}) ADD_LIBRARY(mymath_static STATIC ${SRC_LIST})SET_TARGET_PROPERTIES(mymath_static PROPERTIES OUTPUT_NAME "mymath")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
3 外链接动态库和静态库生成可执行文件
3.1 工程目录
.├── build├── CMakeLists.txt├── include│ └── mymath.h├── libs│ ├── libmymath.a│ └── libmymath.so└── src └── main.c
3.2 工程文件
mymath.h
int add(int a, int b);int sub(int a, int b);
main.c(注意:因为编译的动/静态库是采用的C语言,所以只能写为main.c,而不是main.cpp,否则在链接的时候出问题,当然比较好的做法就是在生成库的时候加入extern "C"
关键字,增加兼容性)
int main(){ printf("Hello CMake!\n"); printf("1 + 5 = %d\n", add(1, 5)); return 0;}
3.3 CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(Test3)SET(CMAKE_C_FLAGS "$ENV{CFLAGS} -O3 -Wall") SET(INCLUDE_PATH ${PROJECT_SOURCE_DIR}/include) MESSAGE(STATUS "Include Path, ${INCLUDE_PATH}")SET(LIB_PATH ${PROJECT_SOURCE_DIR}/libs)MESSAGE(STATUS "Libs Path, ${LIB_PATH}")SET(SOURCE_PATH ${PROJECT_SOURCE_DIR}/src) MESSAGE(STATUS "Source Path , ${SOURCE_PATH}") INCLUDE_DIRECTORIES(${INCLUDE_PATH}) LINK_DIRECTORIES(${LIB_PATH})SET(LIBS_LIST libmymath.a) AUX_SOURCE_DIRECTORY(${SOURCE_PATH} SRC_LIST)SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)SET(EXECUTABLE_FILE_NAME mymath.exe)ADD_EXECUTABLE(${EXECUTABLE_FILE_NAME} ${SRC_LIST})TARGET_LINK_LIBRARIES(${EXECUTABLE_FILE_NAME} ${LIBS_LIST})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
4 CMake常用系统变量
CMAKE_BINARY_DIRPROJECT_BINARY_DIR<projectname>_BINARY_DIRCMAKE_SOURCE_DIRPROJECT_SOURCE_DIR<projectname>_SOURCE_DIRCMAKE_CURRENT_SOURCE_DIRCMAKE_CURRRENT_BINARY_DIRADD_SUBDIRECTORY(src "更改为子目录新的目标文件输出路径")EXECUTABLE_OUTPUT_PATHLIBRARY_OUTPUT_PATHPROJECT_NAMECMAKE_MAJOR_VERSION,CMAKECMAKE_MINOR_VERSION,CMAKECMAKE_PATCH_VERSION,CMAKECMAKE_SYSTEMCMAKE_SYSTEM_NAMECMAKE_SYSTEM_VERSIONCMAKE_SYSTEM_PROCESSORUNIXWIN32BUILD_SHARED_LIBSCMAKE_C_FLAGS/CMAKE_C_FLAGS_DEBUG/CMAKE_C_FLAGS_RELEASESET(CMAKE_C_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")CMAKE_CXX_FLAGS/CMAKE_CXX_FLAGS_DEBUG/CMAKE_CXX_FLAGS_RELEASESET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -lpthread -lm")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
5 CMake常用的指令说明
add_definitions(-DXXX1 -DXXX2 ...)
remove_definitions(-DXXX1 -DXXX2 ...)
aux_source_directory(dir variable)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
INCLUDE_DIRECTORIES(${XXX_INCLUDE_PATH} ${Other_INCLUDE_PATH} ${PROJECT_INCLUDE_PATH})
link_directories(directory1 directory2 ...)
LINK_DIRECTORIES(${XX1_LIB_PATH} ${XX2_LIB_PATH})
target_link_libraries(<target> [item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)
add_library(A STATIC a.c)add_library(B STATIC b.c)target_link_libraries(A B)target_link_libraries(B A)add_executable(main main.c)target_link_libraries(main A)
add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED [GLOBAL])
add_library(calc calc.c)add_library(mylib ${mylib_sources})
get_filename_component(<VAR> <FileName> <COMP> [CACHE])
get_filename_component(WORKSPACE_DIR ${PROJECT_SOURCE_DIR} PATH)get_filename_component(WORKSPACE_DIR ${PROJECT_SOURCE_DIR} DIRECTORY) DIRECTORY = Directory without file name NAME = File name without directory EXT = File name longest extension (.b.c from d/a.b.c) NAME_WE = File name without directory or longest extension ABSOLUTE = Full path to file REALPATH = Full path to existing file with symlinks resolved PATH = Legacy alias for DIRECTORY (use for CMake <= 2.8.11)