Coder Social home page Coder Social logo

cmaketutorial's Introduction

CMakeLists模板持续更新中,欢迎补充

参考资料

ubuntu18.04 基于VSCode的C++环境搭建

编译

# 这是最基础的编译命令
mkdir ./build
cd build
cmake ..
make

运行生成的可执行文件

# 示例:cd build
./test01

模板的适用情况

案例 适用场景 备注
CMakeLists-1.txt 适用于编译同一目录中的多个源文件,且没有调用第三方库,最终编译成一个可执行文件的情况。
CMakeLists-2.txt 适用于编译某一目录中的指定源文件,且没有调用第三方库,最终编译成一个可执行文件的情况。 这个模板最简单,多用于单文件的功能测试。
CMakeLists-3.txt 适用于cpp文件在一个文件夹(src/中),头文件在另一个文件夹内(include/中),且没有调用第三方库,最终编译成一个可执行文件的情况。
CMakeLists-4.txt 适用于cpp文件在一个文件夹(src/中),头文件在另一个文件夹内(include/中),且调用了第三方库(比如已经安装在系统中的opencv),最终编译成一个可执行文件的情况。
CMakeLists-5.txt 使用cmake构建一个工程,该工程创建了两个静态库,另外生成一个引用这两个静态库的可执行文件。 涉及到使用ADD_SUBDIRECTORY实现多个cmakelists的调用。
CMakeLists-6.txt 只有一个动态库subadd,另外生成一个引用该库的可执行文件main。 涉及到使用ADD_SUBDIRECTORY实现多个cmakelists的调用。
CMakeLists-7.txt 使用cmake构建一个工程,每个子模块都有自己的cmakelists,该工程创建了两个静态库和一个动态库,另外生成一个调用这些库的可执行文件。 涉及到使用ADD_SUBDIRECTORY实现多个cmakelists的调用。
CMakeLists-8.txt 只使用cmake构建一个工程,包含多个子模块,但没有自己的cmakelists,该工程创建了两个静态库和一个动态库,另外生成一个调用这些库的可执行文件。 涉及到使用ADD_SUBDIRECTORY实现多个cmakelists的调用。

常用命令

# Note:cmake中不区分大小写。

# 设置变量,方便后面自动配置,进入子模块的cmake时不用再次设置
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)  # 设置可执行文件的输出目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)	   # 设置库文件的输出目录

# 设定源码列表,查找指定目录下的所有源文件,并将名称保存到 DIR_SRCS 变量中
aux_source_directory(./src/ DIR_SRC)

# 设定头文件查找路径,可以将所有头文件路径都添加到这里面
include_directories(./include/
                    ./source/sub)

# 查找并添加OpenCV的头文件目录,在target_link_libraries()中需要进行动态链接
find_package(OpenCV REQUIRED) 

# 编译子模块,会自动调用子模块中的Cmakelists.txt进行编译
add_subdirectory(sub)

# 将${ADD_SRC_LIST}中的所有源码编译生成静态库add
add_library(add ${ADD_SRC_LIST})

# 将${SRCS}中的所有源码编译成一个可执行文件,文件名为main
add_executable( main ${SRCS} )
# 编译可执行文件之后,添加动态链接库,会链接静态库subadd和opencv库
target_link_libraries(main subadd ${OpenCV_LIBS})

# 打印一些日志信息
message("PROJECT_SOURCE_DIR=" ${PROJECT_SOURCE_DIR})

常用变量

# Note:cmake中不区分大小写。

# 工程顶层目录
${CMAKE_SOURCE_DIR} ${PROJECT_SOURCE_DIR}

# 当前处理的 CMakeLists.txt 所在路径
${CMAKE_CURRENT_SOURCE_DIR}

# 返回Cmakelists.txt开头通过 PROJECT 指令定义的项目名称
${PROJECT_NAME}

# 分别用来重新定义最终结果(可执行文件、动静态库文件)的存放目录
${EXECUTABLE_OUTPUT_PATH} ${LIBRARY_OUTPUT_PATH}

cmaketutorial's People

Contributors

ganleiboy avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.