
本文共 2502 字,大约阅读时间需要 8 分钟。
CMake入门:从简单项目到复杂构建
CMake是一种强大的跨平台建造工具,能够自动生成Makefile文件,简化构建过程。它特别适合管理复杂项目,同时支持多平台和模块化构建。本文将从简单的Hello World项目入手,逐步展开,帮助您理解CMake的核心功能。
项目简介
CMake的主要作用是为项目自动生成Makefile文件。虽然它的功能远不止此,但本文将聚焦于这一核心功能。通过实际例子,我们将展示如何使用CMake管理简单项目,以及如何扩展到更复杂的构建需求。
源代码与示例
本文所有代码均来自GitHub仓库exploringBB/extras/cmake
,所有示例均可在Ubuntu上顺利运行。以下是代码的基本结构和使用说明。
git clone https://github.com/derekmolloy/exploringBB.git
示例1:Hello World
项目结构:
-
CMakeLists.txt
(3行内容)cmake_minimum_required(VERSION 2.8.9)project(hello)add_executable(hello helloworld.cpp)
-
extras/cmake/helloworld/
(包含源文件)#include
int main(int argc, char *argv[]){ std::cout << "Hello World!" << std::endl; return 0;}
步骤:
生成Makefile:
cmake -DCMAKE_INSTALL_PREFIX=/usr .
请注意,-DCMAKE_INSTALL_PREFIX
参数用于指定安装路径,可根据需要调整。
编译项目:
make
运行程序:
./hello
通过以上步骤,我们就成功构建并运行了一个简单的Hello World项目。
示例2:包含目录结构的项目
项目结构:
CMakeLists.txt
(新增的内容)cmake_minimum_required(VERSION 2.8.9)project(directory_test)include_directories(include)file(GLOB SOURCES "src/*.cpp")add_executable(testStudent ${SOURCES})
步骤:
生成Makefile:
mkdir buildcd buildcmake ..
编译项目:
make
运行程序:
./testStudent
通过这个示例,我们可以看到CMake在处理包含目录结构的项目时的优势。它能够自动识别源文件并构建可执行文件,减少了传统Makefile的冗余配置。
示例3:动态库编译(.so)
项目结构:
CMakeLists.txt
(新增的内容)cmake_minimum_required(VERSION 2.8.9)project(directory_test)set(CMAKE_BUILD_TYPE Release)include_directories(include)file(GLOB SOURCES "src/*.cpp")add_library(testStudent SHARED ${SOURCES})install(TARGETS testStudent DESTINATION /usr/lib)
步骤:
生成Makefile:
mkdir buildcd buildcmake ..
编译项目:
make
安装动态库:
sudo make install
通过这个示例,我们学会了如何使用CMake构建动态库项目,并将其安装到指定目录。
示例4:静态库编译(.a)
项目结构:
CMakeLists.txt
(修改后的内容)cmake_minimum_required(VERSION 2.8.9)project(directory_test)set(CMAKE_BUILD_TYPE Release)include_directories(include)file(GLOB SOURCES "src/*.cpp")add_library(testStudent STATIC ${SOURCES})install(TARGETS testStudent DESTINATION /usr/lib)
步骤:
生成Makefile:
mkdir buildcd buildcmake ..
编译项目:
make
安装静态库:
sudo make install
通过这个示例,我们掌握了如何使用CMake构建静态库项目,并将其安装到指定目录。
示例5:使用静态库或动态库
项目结构:
CMakeLists.txt
(示例内容)cmake_minimum_required(VERSION 2.8.9)project(TestLibrary)set(CMAKE_BUILD_TYPE Release)include_directories(~/exploringBB/extras/cmake/studentlib_shared/include)add_executable(libtest libtest.cpp)target_link_libraries(libtest ${PROJECT_LINK_LIBS})
步骤:
生成Makefile:
mkdir buildcd buildcmake ..
编译项目:
make
通过这个示例,我们学会了如何在项目中动态或静态链接库文件,充分发挥CMake的优势。
总结
通过以上示例,我们可以看到CMake在项目管理中的强大能力。它不仅支持简单的Hello World项目,还能处理包含目录结构的复杂项目、动态库和静态库的构建。CMake的灵活性和可扩展性使其成为专业开发者的必备工具。
发表评论
最新留言
关于作者
