如何查找通过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
相关产品推荐
相关产品推荐

