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

如何查找通过Nix Flake安装的库路径并在CMake中引用

在Nix Flakes环境中用CMake引用yasmin库

是的,Nix会自动为devShell中的依赖包设置一系列环境变量,帮助CMake定位到库文件和头文件。核心相关变量包括:

  • CMAKE_PREFIX_PATH:CMake会遍历该变量下的路径,查找包的配置文件(如xxxConfig.cmake)
  • CPATH:头文件搜索路径,对应代码中#include的查找逻辑
  • LIBRARY_PATH:编译阶段链接库的搜索路径
  • LD_LIBRARY_PATH:运行阶段动态库的加载路径

你运行nix develop后,yasmin包的安装路径(即$out,类似/nix/store/xxxx-yasmin格式)已经被自动加入到上述变量中。

步骤1:在CMakeLists.txt中引用yasmin

如果yasmin项目的CMake配置正确导出了包信息(安装后存在$out/lib/cmake/yasmin目录及对应配置文件),直接使用CMake原生的find_package即可:

cmake_minimum_required(VERSION 3.10)
project(rover_project)

# 查找yasmin包
find_package(yasmin REQUIRED)

# 添加你的可执行文件
add_executable(rover main.cpp)

# 链接yasmin库
target_link_libraries(rover PRIVATE yasmin::yasmin)

步骤2:处理yasmin未导出CMake配置的情况

如果原yasmin项目没有生成标准CMake配置文件(安装后找不到yasminConfig.cmake),可以通过两种方式解决:

方式A:手动指定链接逻辑

借助Nix设置的环境变量,CMake会自动定位到头文件和库,直接链接即可:

cmake_minimum_required(VERSION 3.10)
project(rover_project)

add_executable(rover main.cpp)

# 直接链接yasmin库(CMake会从LIBRARY_PATH找libyasmin.so,从CPATH找头文件)
target_link_libraries(rover PRIVATE yasmin)

方式B:修改flake中的yasmin derivation,生成CMake配置

如果需要更规范的CMake支持,可以在yasmin的installPhase中手动添加配置文件:

packages.yasmin = with pkgs;
  stdenv.mkDerivation {
    name = "yasmin";
    src = fetchFromGitHub {
      owner = "Yasharth011";
      repo = "yasmin_UNROS";
      rev = "4cd3790dba0a86b769093dc167d73a6cc64280cc"; # v3.3.0
      sha256 = "sha256-QCYiqIGETeOhYbVfhIO3HbFxlvIMDalEBT9ygvrOIio=";
    };
    nativeBuildInputs = [ cmake ];
    configurePhase = ''
      cd yasmin 
      mkdir build && cd build 
      cmake .. -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_INSTALL_PREFIX=$out
    '';
    buildPhase = ''
      make
    ''; 
    installPhase = ''
      make install
      # 手动创建CMake配置文件目录及内容
      mkdir -p $out/lib/cmake/yasmin
      cat > $out/lib/cmake/yasmin/yasminConfig.cmake << EOF
include(CMakeFindDependencyMacro)
find_package(Threads REQUIRED)

add_library(yasmin::yasmin UNKNOWN IMPORTED)
set_target_properties(yasmin::yasmin PROPERTIES
  IMPORTED_LOCATION "$out/lib/libyasmin.so"
  INTERFACE_INCLUDE_DIRECTORIES "$out/include"
  INTERFACE_LINK_LIBRARIES Threads::Threads
)
EOF
    '';
  };

修改后,CMake的find_package(yasmin REQUIRED)就能正常识别包信息。

验证环境变量

如果想确认yasmin路径是否已加入环境变量,可在nix develop的shell中执行:

echo $CMAKE_PREFIX_PATH | grep yasmin
echo $CPATH | grep yasmin

会输出对应的nix store路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:12:40