Loading... 整体来说,如何为cmake配置依赖,我们可以看官方文档中的[相关部分](https://cmake.org/cmake/help/latest/guide/using-dependencies/index.html)。 # 1 add_subdirectory 这种方式是通过直接将库复制到开发目录下,然后修改项目`CMakeLists.txt`引入库的,需要添加的内容如下: ```cmake add_subdirectory(LIBRARY_DIR) # 用于找到链接库,此时子库中的文件(尤其是CMakeLists.txt)对当前CMakeLists可见。 set(INC_DIR ./LIBRARY_DIR/include) # 也可以不设置,下一句直接使用 include_directories(${INC_DIR}) # include对应库 # 然后就可以在add_executable之后为target进行链接了: target_link_libraries(${TARGET} LIBRARY_PROJECT_NAME) # 这个名字是要链接的库的project name,一般在其CMakeLists.txt中体现。 # 如果${TARGET}不能使用,则必须每个target(即add_executable生成对象)都要写一遍 ``` # 2 find_package `find_package`主要从项目外部获取所需的库,一般是build好到系统中的第三方库。通过经典的GNU Autotools(也就是`.\configure`+`cmake`+`make`+`make install`)配置并在本地安装到统一位置的库,一般可以通过这种方式引入到项目中。 为了可以使用并且链接,我们需要为CMake指定include路径,可以直接通过cmake参数来指定: ```pl -DCMAKE_PREFIX_PATH="YOUR_BUILT_LIBRARY_PATH" ``` 当然这种方式会修改全局的cmake配置或者每次运行cmake的时候手写,更好的方式是通过CMakeLists.txt来设置变量: ```cmake set(CMAKE_PREFIX_PATH "YOUR_BUILT_LIBRARY_PATH") ``` 这两种方式的等价对于任何参数来说都是通用的。(注意此处如果是windows下只能用反斜杠而非双斜杠) 然后我们就可以通过`find_package`去找到所需的库了: ```cmake find_package(GTest REQUIRED) # 找到我们所需的库,这是下列指令的基础。设置为REQUIRED可以使找不到库的情况在cmake加载阶段就报错,不必等到编译时。 include_directories("${CMAKE_PREFIX_PATH}\\include") # 指定include路径 link_directories("${CMAKE_PREFIX_PATH}\\lib") # 指定链接路径 find_library(GTest NAMES GTEST "${CMAKE_PREFIX_PATH}") # 上面两条语句是指定给编译指令使用的,在coding阶段我们想要能够正确的让IDE找到库,需要这样去指示它的寻找。 ``` 之后指示生成目标的链接就没什么特别的了: ```cmake add_executable(gtest_study main.cpp) target_link_libraries(gtest_study gtest gtest_main) target_link_libraries(gtest_study gmock gmock_main) ``` 更细节的内容,比如`find_library`的查找策略等等,可见[cmake文档](https://cmake.org/cmake/help/latest/command/find_package.html#search-procedure)。 # 3 FetchContent `FetchContent`是直接从远程地址获取内容,具有多种不同方式,具体细节可见[cmake文档](https://cmake.org/cmake/help/latest/module/FetchContent.html)。 以下是从远端直接获取gtest使用的例子: ```cmake include(FetchContent) FetchContent_Declare( googletest # Specify the commit you depend on and update it regularly. URL https://github.com/google/googletest/archive/e2239ee6043f73722e7aa812a459f54a28552929.zip ) # For Windows: Prevent overriding the parent project's compiler/linker settings set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) ``` --- 以上全部内容是基于一般的cmake+compiler组合的,对于VS+MSYS的组合,其项目配置又有所不同。 © 允许规范转载 打赏 赞赏作者 赞 3 如果觉得我的文章对你有用,请随意赞赏