CMake配置成功但编译失败:第三方库头文件未找到
Apple M1下VS Code+CMake+vcpkg项目编译头文件未找到问题
环境信息
$ uname -a Darwin My-MacBook-Air.local 22.4.0 Darwin Kernel Version 22.4.0: Mon Mar 6 21:00:41 PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T8103 arm64 $ which cmake /opt/homebrew/bin/cmake $ cmake --version cmake version 3.26.3
配置文件
VS Code settings.json
{ "C_Cpp.default.cppStandard": "c++20", "cmake.configureOnOpen": true, "cmake.configureSettings": { "CMAKE_TOOLCHAIN_FILE": "~/Srcs/vcpkg/scripts/buildsystems/vcpkg.cmake" } }
CMakeLists.txt
cmake_minimum_required(VERSION 3.20.0) project(myproj VERSION 0.1.0) set(CMAKE_CXX_STANDARD 20) # headers include_directories(include) # create library add_library(myproj-lib STATIC "src/core/crypto_msg.cpp" "src/rsa/rsa.cpp" ) # add external libraries # openssl set(OPENSSL_ROOT_DIR "~/Srcs/vcpkg/installed/arm64-osx") find_package(OpenSSL REQUIRED) target_link_libraries(myproj-lib PUBLIC OpenSSL::Crypto) # fmt find_package(fmt REQUIRED) target_link_libraries(myproj-lib PUBLIC fmt::fmt) # range find_package(range-v3 REQUIRED) target_link_libraries(myproj-lib PUBLIC range-v3) # main func add_executable(myproj-main main.cpp) set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) include(CPack)
错误详情
配置阶段执行正常:
$ /opt/homebrew/bin/cmake --no-warn-unused-cli -DCMAKE_TOOLCHAIN_FILE:STRING=~/Srcs/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug -S/Users/Bob/myproj -B/Users/Bob/myproj/build -G Ninja [cmake] Not searching for unused variables given on the command line. [cmake] -- The C compiler identification is AppleClang 12.0.5.12050022 [cmake] -- The CXX compiler identification is AppleClang 12.0.5.12050022 [cmake] -- Detecting C compiler ABI info [cmake] -- Detecting C compiler ABI info - done [cmake] -- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc - skipped [cmake] -- Detecting C compile features [cmake] -- Detecting C compile features - done [cmake] -- Detecting CXX compiler ABI info [cmake] -- Detecting CXX compiler ABI info - done [cmake] -- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ - skipped [cmake] -- Detecting CXX compile features [cmake] -- Detecting CXX compile features - done [cmake] -- Found OpenSSL: /Users/Bob/Srcs/vcpkg/installed/arm64-osx/debug/lib/libcrypto.a (found version "3.1.0") [cmake] -- Configuring done (2.6s) [cmake] -- Generating done (0.0s) [cmake] -- Build files have been written to: /Users/Bob/myproj/build
但编译阶段失败:
$ /opt/homebrew/bin/cmake --build /Users/Bob/myproj/build --config Debug --target all -- [2/3] Building CXX object CMakeFiles/myproj-main.dir/main.cpp.o FAILED: CMakeFiles/myproj-main.dir/main.cpp.o /Library/Developer/CommandLineTools/usr/bin/c++ -I/Users/Bob/myproj/include -g -std=gnu++2a -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk -MD -MT CMakeFiles/myproj-main.dir/main.cpp.o -MF CMakeFiles/myproj-main.dir/main.cpp.o.d -o CMakeFiles/myproj-main.dir/main.cpp.o -c /Users/Bob/myproj/main.cpp In file included from /Users/Bob/myproj/main.cpp:2: /Users/Bob/myproj/include/core/core.hpp:4:10: fatal error: 'fmt/format.h' file not found #include <fmt/format.h> ^~~~~~~~~~~~~~ 1 error generated. ninja: build stopped: subcommand failed.
更新信息
在CMakeLists.txt中添加以下代码验证头文件路径:
get_property(dir TARGET fmt::fmt PROPERTY INTERFACE_INCLUDE_DIRECTORIES) message(STATUS ${dir})
输出显示路径已正确识别:
[cmake] -- /Users/Bob/Srcs/vcpkg/installed/arm64-osx/include
查看build/compile_commands.json,发现myproj-lib的编译参数包含了vcpkg头文件路径,但myproj-main的参数中没有:
"/Library/Developer/CommandLineTools/usr/bin/c++ -I/Users/Bob/myproj/include -isystem /Users/Bob/Srcs/vcpkg/installed/arm64-osx/include -g -std=gnu++17 -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk -o CMakeFiles/myproj-lib.dir/src/core/crypto_msg.cpp.o -c /Users/Bob/myproj/src/core/crypto_msg.cpp"
问题分析与解决
核心问题
仅给myproj-lib链接了vcpkg管理的第三方库(使用PUBLIC关键字),但**myproj-main目标未与myproj-lib建立链接关系**,导致myproj-main的编译参数无法继承myproj-lib所依赖的第三方库头文件路径。
解决方案
- 给
myproj-main添加与myproj-lib的链接
在CMakeLists.txt中,add_executable(myproj-main main.cpp)之后添加:
target_link_libraries(myproj-main PRIVATE myproj-lib)
由于myproj-lib用PUBLIC链接了第三方库,myproj-main链接myproj-lib后会自动继承这些依赖的头文件路径和库链接信息。
- 优化路径解析(可选)
CMake对~的解析可能存在兼容性问题,建议将CMAKE_TOOLCHAIN_FILE和OPENSSL_ROOT_DIR中的~/替换为绝对路径,比如:
// VS Code settings.json中修改 "CMAKE_TOOLCHAIN_FILE": "/Users/Bob/Srcs/vcpkg/scripts/buildsystems/vcpkg.cmake"
// CMakeLists.txt中修改 set(OPENSSL_ROOT_DIR "/Users/Bob/Srcs/vcpkg/installed/arm64-osx")
- 使用现代CMake规范(可选)
将全局的include_directories(include)替换为针对myproj-lib的目标级包含,避免全局污染:
target_include_directories(myproj-lib PUBLIC include)
完成以上修改后,重新执行CMake配置和编译即可解决头文件未找到的问题。
内容的提问来源于stack exchange,提问作者xyguo
相关产品推荐
相关产品推荐

