如何在Nix环境中使macOS框架可用于clang?

Savanni D'Gerinel

我在macOS 10.13.5上,正在学习对Rust进行编程,并且使用Nix来控制我的开发环境。

某些操作(例如包括jsonwebtoken库或安装cargo-watch模块)会导致构建需要一个似乎未安装的macOS框架。我收到此错误消息:

  = note: ld: framework not found CoreServices
          clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)

error: aborting due to previous error

error: failed to compile `cargo-watch v6.0.0`, intermediate artifacts can be found at `/var/folders/13/84dj8yr54_1c_pn0s8n7444h0000gn/T/cargo-install.lYPZaEduUBdu`

Caused by:
  Could not compile `cargo-watch`.

这是失败的clang命令的缩写版本:

error: linking with `/nix/store/9j864incgjx7kqggbpisdi3nmssy4qm5-clang-wrapper-5.0.2/bin/cc` failed: exit code: 1
  |
  = note: "/nix/store/9j864incgjx7kqggbpisdi3nmssy4qm5-clang-wrapper-5.0.2/bin/cc" "-m64" "-L" ... "/nix/store/rfp87664xzhl6zv7dx5c1hixasqfxkp4-rustc-1.24.0/lib/rustlib/x86_64-apple-darwin/lib/libcompiler_builtins-ba331b20e371c580.rlib" "-framework" "CoreServices" "-framework" "CoreServices" "-l" "System" "-l" "resolv" "-l" "pthread" "-l" "c" "-l" "m"

我发现唯一尝试做的就是将框架添加到PATH中,但是答案是否正确,或者PATH环境变量无法一直遍历我正在研究的构建位置。

我如何告诉clang在哪里寻找框架?这是否涉及对我的工作环境的更改,还是我需要研究更改要安装的板条箱的构建过程?

更多信息

我发现了该clang -Xlinker -v命令,其输出非常有趣:

@(#)PROGRAM:ld  PROJECT:ld64-274.2
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS)
Library search paths:
    /nix/store/ql6xbmdplca4sjpk0pz647p7djzri03c-libc++-5.0.2/lib
    /nix/store/rfp87664xzhl6zv7dx5c1hixasqfxkp4-rustc-1.24.0/lib
    /nix/store/ql6xbmdplca4sjpk0pz647p7djzri03c-libc++-5.0.2/lib
    /nix/store/rfp87664xzhl6zv7dx5c1hixasqfxkp4-rustc-1.24.0/lib
    /nix/store/8ykfqv6jx9jvfhnc4cdygdzg0piy8253-Libsystem-osx-10.11.6/lib
    /nix/store/4papfih2r9xlsl9m7hlisparij8k9zaq-clang-5.0.2-lib/lib
Framework search paths:
    /nix/store/hc6d711vwlwnn9swmkdpi9nbswbqg6h0-CF-osx-10.10.5/Library/Frameworks
    /nix/store/hc6d711vwlwnn9swmkdpi9nbswbqg6h0-CF-osx-10.10.5/Library/Frameworks
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)

这似乎表明我的Nix Shell缺少某些东西,而不是操作系统甚至clang本身。

Savanni D'Gerinel

显然,尼克斯无论是标准的苹果框架提供包装沙箱环境不够,标准的框架是不可用的。

我为该解决方案发现的大部分内容来自在OS X 10.11上使用适当的SDK和命令行工具,然后来自检查vim-plugins nix派生

第一步是实际安装我的项目需要的框架。他们都住在nixpkgs.darwin.apple_sdk.frameworks

这样做可以使大多数链接正常工作,但是_CFURLResourceIsReachable在我的平台上是未定义的符号。我用一个更新的NIX_LDFLAGS变量来解决这个问题(如vim-plugins nix派生所建议的那样)。我的项目的最终结果是以下shell.nix文件:

let
    pkgs = import <stable> {};
    frameworks = pkgs.darwin.apple_sdk.frameworks;
in pkgs.stdenv.mkDerivation {
    name = "orizentic";

    buildInputs = [ pkgs.rustc
                    pkgs.cargo
                    frameworks.Security
                    frameworks.CoreFoundation
                    frameworks.CoreServices
                  ];

    shellHook = ''
        export PS1="[$name] \[$txtgrn\]\u@\h\[$txtwht\]:\[$bldpur\]\w \[$txtcyn\]\$git_branch\[$txtred\]\$git_dirty \[$bldylw\]\$aws_env\[$txtrst\]\$ "
        export NIX_LDFLAGS="-F${frameworks.CoreFoundation}/Library/Frameworks -framework CoreFoundation $NIX_LDFLAGS";
    '';
}

这给了我cargo-watch包(取决于CoreServicesCoreFoundation)。尽管我还没有设法验证这种依赖关系jsonwebtokenSecurity它显然也解决了依赖关系

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章