目录
5.src_static_lib下CMakeLists.txt
一、目的
1.cmake基本语法
2.cmake使用源文件构建项目
3.cmake构建静态链接库和共享库
4.cmake使用静态链接库构建项目
5.cmake使用动态链接库构建项目
二、环境
wsl unbuntu20.04
三、文件结构
四、文件详情
1.note
# cmake版本要求
cmake_minimum_required(VERSION 3.0)
# CMakeLists.txt项目,每个CMakeLists.txt可有一个project
project(demo)
# cmake内部变量CMAKE_HOME_DIRECTORY --顶层CMakeLists.txt所在文件夹
# cmake内部变量PROJECT_SOURCE_DIR --当前CMakeLists.txt所在文件夹
# 设置变量
set(SRC_LIST ./main.c)
# 取变量
${SRC_LIST}
# 控制cmake变量
option(MYOPTION "this is for cmakelist.txt case" ON)
if (MYOPTION)
message("MYOPTION is ON")
else()
message("MYOPTION is OFF")
endif()
# 搜索文件夹,填充变量
aux_source_directory(. VARIABLE)
# 搜索文件;满足条件,填充变量
file(GLOB SRCS ./src/*.cpp)
file(GLOB HEADS ./include/*.hpp)
# 添加编译选项
add_compile_options(-Wall)
# 指定c++标准
set(CMAKE_CXX_STANDARD 11) #方法一
cmake . -DCMAKE_CXX_STANDARD=11 #方法二
add_compile_options(-std=c++11) #方法三
# 添加cmake子目录,该目录下应当有CMakeLists.txt
add_subdirectory(build)
# .目录下的源文件添加到变量SRC_LIST
aux_source_directory(. SRC_LIST) #等价于 set(SRC_LIST ./main.c)
# 添加包含目录
include_directories(path1 path2)
# 指定可执行文件输出路径(可执行文件或动态库)
set(EXECUTABLE_OUTPUT_PATH ./bin)
# 设置库的输出路径(动态或静态库)
set(LIBRARY_OUTPUT_PATH /lib)
# 添加生成库,库将作为生成目标
add_library(lib_name type source_file) #如add_library(libfun1_shared SHARED fun1.c)、add_library(libfun1_static STATIC fun1.c)
# 查找动态库到变量MYLIBS !LIBS是内部变量!
find_library(MYLIBS libname path) #如find_libraries(MYLIBS lib.so path) find_libraries(MYLIBS lib.a path)
# 添加源文件到可执行文件
add_executable(main $(SRC_LIST))
# 链接静态库;动态库(可执行文件)也可用
target_link_libraries(main MYLIBS)
2.顶层CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(demo)
message("CMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY},PROJECT_NAME=${PROJECT_NAME},PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}")
add_subdirectory(src) # 使用源文件构建项目
add_subdirectory(build_lib) # 构建静态库和共享库
add_subdirectory(src_static_lib) # 使用静态库构建项目
add_subdirectory(src_shared_lib) # 使用共享库构建项目
3.src下CMakeLists.txt
project(main)
message("CMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY},PROJECT_NAME=${PROJECT_NAME},PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}")
aux_source_directory(. SRC_LIST)
include_directories(../include)
add_executable(main ${SRC_LIST})
set(EXECUTABLE_OUTPUT_PATH ../bin)
4.build_lib下CMakeLists.txt
project(build_lib)
message("CMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY},PROJECT_NAME=${PROJECT_NAME},PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}")
set(LIB_SRC1 ${CMAKE_HOME_DIRECTORY}/src/fun1.c)
set(LIB_SRC2 ${CMAKE_HOME_DIRECTORY}/src/fun2.c)
add_library(libfun1_static STATIC ${LIB_SRC1})
add_library(libfun2_shared SHARED ${LIB_SRC2})
set(LIBRARY_OUTPUT_PATH ${CMAKE_HOME_DIRECTORY}/lib)
set_target_properties(libfun1_static PROPERTIES OUTPUT_NAME "fun1")
set_target_properties(libfun2_shared PROPERTIES OUTPUT_NAME "fun2")
5.src_static_lib下CMakeLists.txt
project(static)
message("CMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY},PROJECT_NAME=${PROJECT_NAME},PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}")
include_directories(${CMAKE_HOME_DIRECTORY}/include)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_HOME_DIRECTORY}/bin)
set(SRCS ./main.c)
find_library(STATIC_LIBS libfun1.a ${CMAKE_HOME_DIRECTORY}/lib)
message("STATIC_LIBS=${STATIC_LIBS}")
add_executable(static ${SRCS})
target_link_libraries(static ${STATIC_LIBS})
6.src_shared_lib下CMakeLists.txt
project(shared)
message("CMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY},PROJECT_NAME=${PROJECT_NAME},PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}")
include_directories(${CMAKE_HOME_DIRECTORY}/include)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_HOME_DIRECTORY}/bin)
set(SRCS ./main.c)
# 添加动态链接库到变量LIBS
find_library(SHARED_LIBS libfun2.so ${CMAKE_HOME_DIRECTORY}/lib)
message("SHARED_LIBS=${SHARED_LIBS}")
add_executable(shared ${SRCS})
target_link_libraries(shared ${SHARED_LIBS})
7.include下fun1.h
#ifndef _FUN1_H_
#define _FUN1_H_
extern void fun1(void);
#endif
8.include下fun2.h
#ifndef _FUN2_H_
#define _FUN2_H_
extern void fun2(void);
#endif
9.src下fun1.c
#include <stdio.h>
void fun1(void) {
fprintf(stdout, "file:%s,fun:%s,line:%d\n", __FILE__, __FUNCTION__, __LINE__);
}
10.src下fun2.c
#include <stdio.h>
void fun2(void) {
fprintf(stdout, "file:%s,fun:%s,line:%d\n", __FILE__, __FUNCTION__, __LINE__);
}
11.src下main.c
#include <fun1.h>
#include <fun2.h>
int main(int argc, char** argv) {
fun1();
fun2();
return 0;
}
12.src_static_lib下main.c
#include <fun1.h>
int main(int argc, char** argv) {
fun1();
return 0;
}
13.src_shared_lib下main.c
#include <fun2.h>
int main(int argc, char** argv) {
fun2();
return 0;
}
五、演示
1.使用cmake生成makefile
2.使用make编译
3.运行