cmake简单案例

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)

编译后拷贝文件

扫描二维码关注公众号,回复: 15754191 查看本文章
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

具体写法参考 https://github.com/google/googletest/tree/master/googletest#incorporating-into-an-existing-cmake-project

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

CMake Tutorial — CMake 3.23.0-rc2 Documentation

CMake 手册详解(六) - SirDigit - 博客园

猜你喜欢

转载自blog.csdn.net/u013701860/article/details/105610787#comments_25297950