You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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所依赖的第三方库头文件路径。

解决方案

  1. 给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后会自动继承这些依赖的头文件路径和库链接信息。

  1. 优化路径解析(可选)
    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")
  1. 使用现代CMake规范(可选)
    将全局的include_directories(include)替换为针对myproj-lib的目标级包含,避免全局污染:
target_include_directories(myproj-lib PUBLIC include)

完成以上修改后,重新执行CMake配置和编译即可解决头文件未找到的问题。


内容的提问来源于stack exchange,提问作者xyguo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:14:55