CMake已找到GSL库但C++代码无法引入头文件的问题
解决CMake检测到GSL但编译时找不到头文件的问题
问题概述
在Ubuntu 22.04上通过sudo apt-get install libgsl-dev安装了GSL 2.7.1,CMake执行时显示-- Found GSL: /usr/include (found version "2.7.1"),但编译时提示gsl/gsl_sf_bessel.h: No such file or directory。编译使用的是conda环境中的C++编译器。
问题原因
从终端日志可看到,当前使用的是conda环境下的编译器(/home/iii/miniconda3/envs/tf/bin/x86_64-conda-linux-gnu-c++),而conda编译器默认不会搜索系统级的/usr/include目录——即便CMake找到了GSL的位置,编译阶段依然无法定位到头文件。
解决方案
方案1:修正CMakeLists.txt(推荐)
使用CMake的现代导入目标特性,让目标自动获取GSL的头文件路径和链接库。修改后的CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.5.1) project(mujoco_gym) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") find_package(GSL REQUIRED) include_directories(${PROJECT_SOURCE_DIR}) file(GLOB SOURCE_FILES mujoco_gym.cpp) add_executable(${CMAKE_PROJECT_NAME} ${SOURCE_FILES}) # 用GSL的导入目标,自动处理头文件包含和库链接 target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE GSL::gsl GSL::gslcblas)
修改后重新执行编译流程:
rm -rf build && mkdir build && cd build cmake .. cmake --build . --config Release
方案2:指定系统头文件路径给conda编译器
若不想修改CMakeLists,可在运行cmake时显式添加系统头文件目录:
rm -rf build && mkdir build && cd build cmake .. -DCMAKE_CXX_FLAGS="-I/usr/include" cmake --build . --config Release
方案3:临时退出conda环境
直接使用系统默认的GCC编译器,它会自动搜索/usr/include:
conda deactivate rm -rf build && mkdir build && cd build cmake .. cmake --build . --config Release
验证
编译成功后,运行生成的可执行文件:
./mujoco_gym
将输出贝塞尔函数的计算结果。
内容的提问来源于stack exchange,提问作者Ant
相关产品推荐
相关产品推荐

