touch CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(cmake_study LANGUAGES CXX)
add_executable(
main
main.cpp
)
target_include_directories(
main
PUBLIC
inc
)
target_link_libraries(
main
PUBLIC
/mnt/d/linux_codes/cpp/lib/libfun1.so
)
# cmake build library
# add_library(
# fun1
# SHARED
# lib/fun1.cpp
# )
添加头文件和库依赖
# third party include and library
include_directories(
/mnt/d/linux_codes/cpp/inc
)
link_directories(
/mnt/d/linux_codes/cpp/lib
)
target_link_libraries(main PUBLIC libfun1.so)
example 2
# cmake 最低版本需求
cmake_minimum_required(VERSION 3.10)
# export CC=/usr/bin/gcc
# export CXX=/usr/bin/g++
set(CMAKE_CXX_COMPILER "/usr/local/bin/g++")
set(CMAKE_C_COMPILER "/usr/local/bin/gcc")
# 工程名称
project(main LANGUAGES CXX)
add_compile_options(-std=c++11)
# 编译源码生成目标
add_executable(
main
main.cpp
)
target_include_directories(
main
PUBLIC
inc
)
target_link_libraries(
main
PUBLIC
/usr/local/xx/libruntime.so
)
获取软件包(FetchContent) (CMake 3.11+)
https://modern-cmake-cn.github.io/Modern-CMake-zh_CN/chapters/projects/fetch.html
example
include(FetchContent)
FetchContent_Populate(
utf8proc_src
URL "https://github.com/JuliaStrings/utf8proc/archive/refs/tags/v2.8.0.tar.gz"
SOURCE_DIR ${THIRDPARTY_DIR}/utf8proc
)
FetchContent_Populate(
boost_src
URL "https://boostorg.jfrog.io/artifactory/main/release/1.81.0/source/boost_1_81_0.tar.gz"
SOURCE_DIR ${THIRDPARTY_DIR}/boost
)
指定生成先后顺序
add_dependencies(main target1 target2)
添加子目录
add_subdirectory(dir_name)
生成动态库
add_compile_options(-fPIC)
add_library(lib1 SHARED lib1.cpp)
set_property(TARGET lib1 PROPERTY POSITION_INDEPENDENT_CODE ON)
编译后拷贝文件
add_custom_command(
TARGET custom_fusion POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
./xx.so
dst_dir/xx.so)
file(COPY ${THIRDPARTY_DOWNLOAD_DIR}/lib/libxx.so DESTINATION ${CMAKE_BINARY_DIR})
自动获取文件夹文件
# create test target for each cpp file
foreach (testf_file ${TEST_SRC})
get_filename_component(file_name ${testf_file} NAME_WE)
add_executable(
${file_name}
${testf_file}
)
add_dependencies(${file_name} xxx)
endforeach()
cmake – How can I build a C++ project with multiple interdependent subdirectories? – Stack Overflow
读取环境变量 set(TF_LIB_PATH $ENV{TF_LIB_PATH})
从源码安装cmake
./configure
make
make install
message
set(TESTINFO "hello")
message(STATUS "message to display " ${TESTINFO})
编译时的一些坑
add_compile_options(-std=c++11)
add_compile_options(-fPIC)
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
默认D_GLIBCXX_USE_CXX11_ABI应该是1,导致编译出来的string函数符号不对,含有cxx1112basic_stringIcSt11char,改成0就好了
编译出来的符号是
std::__cxx11::string而库符号是std::string
,也可以尝试通过重设ABI=0解决。
import lib
add_library(lib_mkldnn SHARED IMPORTED)
set_target_properties(
lib_mkldnn
PROPERTIES IMPORTED_LOCATION
${LIB_MKLDNN_IMPORTED_LOCATION}
)
lib相对路径
LINK_DIRECTORIES(./lib)
cmake执行命令下载
execute_process(
COMMAND wget https://gitee.com/mirrors/googletest/repository/archive/release-1.8.0.tar.gz
COMMAND tar -xvf release-1.8.0.tar.gz
)
set(SOURCE_DIR “${CMAKE_CURRENT_SOURCE_DIR}”)
set(BUILD_DIR “${CMAKE_CURRENT_BINARY_DIR}”)
MESSAGE(${SOURCE_DIR})
MESSAGE(${BUILD_DIR})
configure_file(input output options) 将一个文件拷贝到指定位置,并根据
options
修改其内容。
ExternalProject_Add :
CMake学习笔记05–ExternalProject_Add模块_zhouyuming_hbxt的博客-CSDN博客_externalproject_add
CMake详解之ExternalProject_xueqiu1141的博客-CSDN博客_externalproject
CMAKE内置变量介绍
cmake 常用变量和常用环境变量查表手册—整理 . – 香格里拉\(^o^)/ – 博客园
cmake – Difference between CMAKE_CURRENT_SOURCE_DIR and CMAKE_CURRENT_LIST_DIR – Stack Overflow
CMAKE_SOURCE_DIR
CMAKE_LIST_DIR
CMAKE_CURRRENT_BINARY_DIR
CMAKE_CURRENT_SOURCE_DIR
CMAKE_CURRENT_LIST_DIR
ExternalProject — CMake 3.23.0-rc2 Documentation
cmake_minimum_required(VERSION 3.8)
include(ExternalProject)
ExternalProject_Add(
lib_download
GIT_REPOSITORY http://xxx.git
GIT_TAG xxx
SOURCE_DIR ${THIRDPARTY_DOWNLOAD_DIR}/xxx
BINARY_DIR ${THIRDPARTY_DOWNLOAD_DIR}/xxx/src
CONFIGURE_COMMAND ""
BUILD_COMMAND make
INSTALL_COMMAND ""
TEST_COMMAND ""
)
ExternalProject_Add(
fp16
URL "FP16.zip"
DOWNLOAD_DIR ${THIRDPARTY}/FP16
SOURCE_DIR ${THIRDPARTY}/FP16
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
)
gtest cmake simple
unit testing – How to start working with GTest and CMake – Stack Overflow
cmake_minimum_required(VERSION 2.8)
project(basic_test)
add_compile_options(-std=c++11)
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
ADD_SUBDIRECTORY(./googletest)
add_executable(main main.cpp)
add_executable(runUnitTests run_test.cpp)
target_include_directories(
runUnitTests
PUBLIC
${gtest_SOURCE_DIR}/include
)
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests gtest gtest_main)
enable_testing()
add_test(runUnitTests runUnitTests)
gtest project structure
c++ – CMake: Project structure with unit tests – Stack Overflow
set(MS_INSTALL_DIR “/mnt/l00536746/mindspore/mindspore-lite-1.6.0-linux-x64/”)
include_directories(${MS_INSTALL_DIR}/runtime/)
target_link_libraries(
xx
-Wl,–whole-archive mindspore-lite -Wl,–no-whole-archive
pthread
)
cmake find example
https://github.com/modelbox-ai/modelbox/tree/main/CMake
cmake引入gtest简单方法,并且给每个test.cpp创建对应的测试可执行文件
cmake_minimum_required(VERSION 3.10)
project(cmake_study LANGUAGES CXX)
include(ExternalProject)
set(THIRDPARTY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party")
ExternalProject_Add(
googletest
URL "https://github.com/google/googletest/archive/refs/tags/release-1.12.1.tar.gz"
DOWNLOAD_DIR ${THIRDPARTY_DIR}/googletest/
SOURCE_DIR ${THIRDPARTY_DIR}/googletest/
)
include_directories(
${THIRDPARTY_DIR}/googletest/googletest/
${THIRDPARTY_DIR}/googletest/googletest/include/
)
参考
https://cliutils.gitlab.io/modern-cmake/modern-cmake.pdf
CMake 教程 | CMake 从入门到应用 – Aiden Blog