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_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR
CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR
CMAKE_CURRENT_SOURCE_DIR
CMAKE_CURRRENT_BINARY_DIR
ADD_SUBDIRECTORY(src "更改为子目录新的目标文件输出路径")
EXECUTABLE_OUTPUT_PATH
LIBRARY_OUTPUT_PATH
PROJECT_NAME
CMAKE_MAJOR_VERSION,CMAKE
CMAKE_MINOR_VERSION,CMAKE
CMAKE_PATCH_VERSION,CMAKE
CMAKE_SYSTEM
CMAKE_SYSTEM_NAME
CMAKE_SYSTEM_VERSION
CMAKE_SYSTEM_PROCESSOR
UNIX
WIN32
BUILD_SHARED_LIBS
CMAKE_C_FLAGS/CMAKE_C_FLAGS_DEBUG/CMAKE_C_FLAGS_RELEASE
SET(CMAKE_C_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
CMAKE_CXX_FLAGS/CMAKE_CXX_FLAGS_DEBUG/CMAKE_CXX_FLAGS_RELEASE
SET(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)