记录CMake使用的基本场景,来自《CMake Practice》,默认使用外部编译。
main.c
#include<stdio.h>
int main(int argc,char **argv)
{
printf("Hello World!\n");
return 0;
}
hello.h
#include<stdio.h>
void func();
hello.c
#include"hello.h"
void func()
{
printf("Hello World!\n");
}
Demo1-单文件
目录结构
CMakeLists.txt
main.c
CMakeLists.txt
# CMake版本声明
cmake_minimum_required(VERSION 2.8)
# 工程名声明
project(Demo1)
#设置变量名
set(SRC_LIST main.c) #将main.c保存到SRC_LIST变量中
#打印消息
message(STATUS "This is BINARY dir" ${Demo1_BINARY_DIR})
message(STATUS "This is SOURCE dir" ${Demo1_SOURCE_DIR})
# 生成可执行文件
add_executable(Demo1 ${SRC_LIST})
Demo2-生成动静态库,并将结果放到指定位置
目录结构
CMakeLists.txt
src
- CMakeLists.txt
- hello.c
- hello.h
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(Demo2)
set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR}/pack) #build目录下的pack目录中
add_subdirectory(src)
src/CMakeLists.txt
add_library(hello_static STATIC hello.c)
add_library(hello_shared SHARED hello.c)
set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")
set_target_properties(hello_shared PROPERTIES OUTPUT_NAME "hello")
set_target_properties(hello_shared PROPERTIES VERSION 1.2 SOVERSION 1)
install(TARGETS hello_static hello_shared
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
install(FILES hello.h DESTINATION include)
Demo3-多目录
目录结构
CMakeLists.txt
src
- func.c
- CMakeLists.txt
- main.c
include
- hello.h
- func.h
lib
- libhello.a
myadd.h
int myadd(int a,int b); //加法
myadd.c
#include"myadd.h"
int myadd(int a, int b)
{
return a+b;
}
main.c
#include"hello.h"
#include"myadd.h"
int main(int argc,char **argv)
{
printf("sum:%d\n",myadd(3,4));
func();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(Demo3)
set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR})
add_subdirectory(src)
src/CMakeLists.txt
include_directories(${PROJECT_SOURCE_DIR}/include) #头文件路径
link_directories(${PROJECT_SOURCE_DIR}/lib) #库文件路径
message(STATUS "qiu:" ${PROJECT_SOURCE_DIR})
add_executable(Demo3 main.c myadd.c)
target_link_libraries(Demo3 libhello.a)
message(STATUS "kai" ${CMAKE_INSTALL_PREFIX})
install(TARGETS Demo3
RUNTIME DESTINATION bin)
Demo4-带文档,输出打包目录
目录结构
CMakeLists.txt
src
- func.c
- CMakeLists.txt
- main.c
include
- hello.h
- func.h
lib
- libhello.a
doc
- doc1.txt
- doc2.txt
README.md
start.sh
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(Demo4)
set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR}/pack)
install(FILES README.md DESTINATION .) #文档
install(DIRECTORY doc DESTINATION .) #目录
install(PROGRAMS start.sh DESTINATION .) #脚本
add_subdirectory(src)
src/CMakeLists.txt
include_directories(${PROJECT_SOURCE_DIR}/include) #头文件路径
link_directories(${PROJECT_SOURCE_DIR}/lib) #库文件路径
add_executable(Demo4 main.c myadd.c)
target_link_libraries(Demo4 libhello.a)
install(TARGETS Demo4
RUNTIME DESTINATION .)