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

为何CMake无法找到krb5头文件但g++编译却成功?

问题:CMake项目无法找到krb5/krb5.h头文件,但g++直接编译成功

环境确认

已在AlmaLinux系统安装krb5-devel包,头文件位于/usr/include目录,库文件位于/usr/lib64目录。

安装确认命令输出:

$ sudo dnf install krb5-devel
Last metadata expiration check: 3:13:07 ago on Tue 28 Oct 2025 07:34:14 AM CST.
Package krb5-devel-1.18.2-32.el8_10.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

头文件与库文件查找结果:

$ find /usr/include /usr/local/include -name krb5.h
/usr/include/krb5/krb5.h
/usr/include/krb5.h
$ find /usr/lib64 -name "*krb5*"
/usr/lib64/libgssapi_krb5.so.2
/usr/lib64/pkgconfig/krb5-gssapi.pc
/usr/lib64/pkgconfig/krb5.pc
/usr/lib64/pkgconfig/mit-krb5-gssapi.pc
/usr/lib64/pkgconfig/mit-krb5.pc
/usr/lib64/sssd/modules/sssd_krb5_localauth_plugin.so
/usr/lib64/sssd/modules/sssd_krb5_idp_plugin.so
/usr/lib64/sssd/libsss_krb5_common.so
/usr/lib64/sssd/libsss_krb5.so
/usr/lib64/krb5
/usr/lib64/krb5/plugins/libkrb5
/usr/lib64/krb5/plugins/libkrb5/sssd_krb5_locator_plugin.so
/usr/lib64/python3.6/site-packages/gssapi/raw/mech_krb5.cpython-36m-x86_64-linux-gnu.so
/usr/lib64/libgssapi_krb5.so.2.2
/usr/lib64/libkrb5.so.3
/usr/lib64/libkrb5.so.3.3
/usr/lib64/libkrb5support.so.0
/usr/lib64/libkrb5support.so.0.1
/usr/lib64/samba/libauthkrb5-samba4.so
/usr/lib64/samba/libkrb5samba-samba4.so
/usr/lib64/libndr-krb5pac.so.0
/usr/lib64/libndr-krb5pac.so.0.0.1
/usr/lib64/libgssapi_krb5.so
/usr/lib64/libkrb5.so
/usr/lib64/libkrb5support.so

代码与配置

源文件testKrk5.cc:

#include <krb5/krb5.h>
#include <stdio.h>

int main() {
    krb5_context context;
    krb5_error_code ret = krb5_init_context(&context);
    if (ret) {
        fprintf(stderr, "Kerberos init failed: %s\n", krb5_get_error_message(context, ret));
        return 1;
    }
    printf("Kerberos initialized successfully!\n");
    krb5_free_context(context);
    return 0;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(krb5tester CXX)

add_executable(krb5tester testKrk5.cc)

target_include_directories(krb5tester PRIVATE /usr/include/krb5)

link_directories(/usr/lib64)

target_link_libraries(krb5tester PRIVATE krb5)

编译情况

CMake编译报错:

(base) [ CxxCodeStudy]$ cmake -S . -B build
-- The CXX compiler identification is GNU 11.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/${MY_HOME}/anaconda3/bin/x86_64-conda-linux-gnu-c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/${MY_HOME}/code/CxxCodeStudy/build
(base) [ CxxCodeStudy]$ cmake --build ./build/
[ 50%] Building CXX object CMakeFiles/krb5tester.dir/testKrk5.cc.o
/home/${MY_HOME}/code/CxxCodeStudy/testKrk5.cc:1:10: fatal error: krb5/krb5.h: No such file or directory
    1 | #include <krb5/krb5.h>
      |          ^~~~~~~~~~~~~
compilation terminated.
gmake[2]: *** [CMakeFiles/krb5tester.dir/build.make:76: CMakeFiles/krb5tester.dir/testKrk5.cc.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/krb5tester.dir/all] Error 2
gmake: *** [Makefile:91: all] Error 2

g++直接编译成功:

(base) [CxxCodeStudy]$ g++ testKrk5.cc -o krb5tester -I/usr/include/krb5 -L/usr/lib64 -lkrb5
(base) [ CxxCodeStudy]$ ls 
build  build.sh  CMakeLists.txt  krb5tester  testKrk5.cc
(base) [ CxxCodeStudy]$ ./krb5tester 
Kerberos initialized successfully!

问题原因与解决方法

问题根源

CMake配置中target_include_directories指定了/usr/include/krb5,但代码中#include <krb5/krb5.h>需要从/usr/include开始查找——因为头文件的完整路径是/usr/include/krb5/krb5.h。如果指定-I/usr/include/krb5,编译器会尝试在该目录下寻找krb5/krb5.h,即/usr/include/krb5/krb5/krb5.h,显然不存在。

解决方法1:修正包含目录

将CMakeLists.txt中的包含目录改为/usr/include:

target_include_directories(krb5tester PRIVATE /usr/include)

解决方法2:使用CMake内置FindKerberos模块(推荐)

CMake内置了FindKerberos模块,可自动查找Kerberos的头文件和库,无需手动指定路径:

cmake_minimum_required(VERSION 3.10)
project(krb5tester CXX)

find_package(Kerberos REQUIRED)

add_executable(krb5tester testKrk5.cc)

target_link_libraries(krb5tester PRIVATE Kerberos::Kerberos)

解决方法3:修改代码include路径(不推荐)

若不想修改CMake配置,可将代码中的#include <krb5/krb5.h>改为#include <krb5.h>,配合原CMake的/usr/include/krb5包含目录即可找到头文件,但此方法会降低代码可移植性。

内容的提问来源于stack exchange,提问作者Monhde Sau Hung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 03:08:11