【问题标题】:How can I make macOS frameworks available to clang in a Nix environment?如何在 Nix 环境中使 macOS 框架可用于 clang?
【发布时间】:2018-12-12 03:50:55
【问题描述】:

我使用的是 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 在哪里寻找框架?它是否涉及对我的工作环境的更改,或者我是否需要考虑更改我要安装的 crate 的构建过程?

更多信息

我发现了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 本身。

【问题讨论】:

    标签: macos rust rust-cargo nix


    【解决方案1】:

    显然 Nix 都为标准 Apple 框架提供了包沙箱环境足以使标准框架不可用。

    我为这个解决方案发现的大部分内容来自Use proper SDK and command-line tools on OS X 10.11,然后来自检查vim-plugins nix derivation

    第一步是实际安装我的项目需要的框架。他们都住在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 的依赖关系,尽管我还没有设法验证这一点。

    【讨论】:

    • 我实际上有同样的问题,但我无法运行nix-env -i nixpkgs.drawin.apple_sdk.frameworks,因为 darwin、apple_sdk 和框架似乎都不存在。您是否需要执行某个步骤才能让它们显示出来,或者它们是否与您的 OS X 版本相关联?
    • 我发现 nix-env 在实际查找包时特别棘手。但是由于您将通过路径而不是名称进行安装,因此它需要更像nix-env -i -A nixpkgs.darwin.apple_sdk.frameworks...。而且您需要指定框架,而不是整个框架属性。
    • 您也可以安装nixpkgs.darwin.apple_sdk,它会为您提供包含所有框架的整个 SDK
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2017-05-07
    • 2015-02-27
    • 2011-12-04
    • 1970-01-01
    • 2018-09-23
    • 2019-03-19
    相关资源
    最近更新 更多