为何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
相关产品推荐
相关产品推荐

