使用CMake引入第三方库,高效管理你的项目
在软件开发过程中,使用第三方库可以大大提高开发效率。然而,使用各种不同的库可能会导致项目变得混乱,因为你需要确保每个库的版本彼此兼容,而且还要处理一些其他的东西,例如在Windows和Linux之间构建项目。CMake就是一个非常好用的工具,可以将这些混乱的组件整合到一起,让你高效地管理整个项目的过程。
在本文中,我们将探讨如何使用CMake来引入第三方库,以及如何利用它来构建项目。
为什么使用CMake?
CMake是一个跨平台的构建工具,可以让你在一个独立的环境中编译和构建你的项目。它可以跨越Windows、Linux和Mac等各种不同的操作系统和编译器,让你的项目能够独立于这些环境,从而使你的项目更加具有可移植性。
另一个CMake的优势是它具有良好的抽象层。与其他构建工具相比,CMake提供了一种可以隐藏底层细节的方法,即通过使用可移植的CMakeList脚本文件。这使得构建过程变得更加简单且易于管理,同时还有助于减少引入错误的机会。
引入第三方库
假设我们正在编写一个项目,而其依赖于某个第三方库。在这个例子中,我们将使用Google的测试框架来测试我们的代码。
首先,我们需要下载我们要使用的库。在Google测试框架的情况下,我们可以从github上下载最新的版本。我们也可以在项目的构建过程中利用CMake自动下载和构建这个库。在这个例子中,我们将假设我们已经下载和解压了测试框架。
为了引入这个库,我们需要告诉CMake在哪里可以找到这些文件。为此,我们需要定义一个CMake变量来表示它们的位置。要定义这个变量,我们需要在我们的CMakeList文件中添加以下代码:
“`
# google test library
set(gtest_force_shared_crt ON CACHE BOOL “Use shared (DLL) run-time lib even when Google Test is built as static lib.”)
add_subdirectory(“${PROJECT_SOURCE_DIR}/third-party/googletest” “third-party/googletest”)
include_directories(“${PROJECT_SOURCE_DIR}/third-party/googletest/googletest/include”)
“`
第二行将设置一个变量,告诉CMake使用共享运行时库,即使Google测试是作为静态库构建的。这通常是Windows操作系统所必需的,因为它需要使用共享运行时库,而不是默认的静态运行时库。
接下来的两行告诉CMake在哪里可以找到我们刚刚下载和解压的Google测试库。第一行调用了add_subdirectory函数,告诉CMake在其中查找test/CMakeLists.txt文件,并告诉它将这个目录添加到构建过程中。第二行调用了include_directories指示CMake编译时可在某个目录中查找头文件。
现在我们已经告诉CMake关于Google测试框架,接下来我们将把测试目标添加到我们的项目中。为此,我们需要在项目中创建一个测试子目录,并在其中创建一个CMakeList脚本,然后添加测试代码并链接Google测试库。下面是一个示例test/CMakeLists.txt文件:
“`
# google test
set(test_dir “test”)
include_directories(“${PROJECT_SOURCE_DIR}/${test_dir}”)
set(TEST_SOURCE_FILES
“${CMAKE_CURRENT_LIST_DIR}/test.cpp”
“${CMAKE_CURRENT_LIST_DIR}/other_test.cpp”
)
add_executable(runUnitTests ${TEST_SOURCE_FILES})
target_include_directories(runUnitTests PRIVATE “${PROJECT_SOURCE_DIR}/${test_dir}”)
target_link_libraries(runUnitTests PRIVATE gtest gtest_main)
# Discover and add test cases to the test runner
if(BUILD_TESTING)
add_test(NAME UnitTests COMMAND runUnitTests –gtest_output=xml:${CMAKE_CURRENT_BINARY_DIR}/test_results.xml)
endif()
“`
这个文件最左侧的一行将test目录保存为一个变量。我们还将该目录添加到项目的头文件搜索路径中。
下一步,我们需要确定要测试哪些源文件。在这个例子中,我们包含了test.cpp和other_test.cpp文件,但你可以自由添加需要测试的源文件。
接下来,我们需要创建一个可执行文件。这个可执行文件将是运行我们的测试的实际程序,这里我们将命名它为runUnitTests。我们要把所有要编译的源文件(通过TEST_SOURCE_FILES定义)添加到可执行文件中。
因最后在构建过程中,需要链接Google测试框架,我们使用target_link_libraries函数调用将其链接到runUnitTests可执行文件中
最后,我们将添加一个测试。如果你这个项目用于自动化程序构建,在执行CTest时可以自动从runUnitTests链接。我们可以通过将BUILD_TESTING设为On或Off来控制测试是否会被构建。在最后一行,我们使用add_test()将该测试添加到测试套件中。
总结
本文只是介绍了使用CMake在项目中引入第三方库的方法的一小部分。使用CMake能够快速方便地管理项目,使得构建过程更加地统一化以及可重复性。使用CMake编写脚本,并按照我们的需求引入外部依赖库,为整个开发过程带来了极大的便利。最终目标是让我们的项目更可靠、可移植,这样我们的队伍就可以专注于写出更好的代码。