我在macOS 10.13.5上学习编程,我使用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"

我发现唯一可以try 的是向PATH中添加框架,但要么这个答案是错误的,要么PATH环境变量无法通过Cargo 到达我正在进行的构建的地方.

我如何告诉clang在哪里寻找框架?这是否涉及改变我的工作环境,或者我是否需要考虑改变我想要安装的 crate 的构建过程?

More information

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

推荐答案

显然,Nix都为标准Apple框架提供了软件包,and个Sandbox 足以支持标准框架不可用的环境.

我对这个解决方案的大部分发现来自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插件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的依赖,尽管我还没有设法验证这一点.

Rust相关问答推荐

将此字符串转换为由空格字符分隔的空格

铁 rust 干线无法使用PowerShell获取环境变量

将大小为零的类型实例存储到空指针中

在rust sqlx中使用ilike和push bind

返回Result<;(),框<;dyn错误>>;工作

是否提供Bundle 在可执行文件中的warp中的静态文件?

在使用粗粒度锁访问的数据 struct 中使用 RefCell 是否安全?

std mpsc 发送者通道在闭包中使用时关闭

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

如何从borrow 的异步代码运行阻塞代码?

std::vector::shrink_to_fit 如何在 Rust 中工作?

为什么要这样编译?

如何在 Emacs Elisp 中获得类似格式化的 LSP?

如何创建递归borrow 其父/创建者的 struct ?

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

如何获得对数组子集的工作可变引用?

为什么 Rust 编译器在移动不可变值时执行复制?

如果我不想运行析构函数,如何移出具有析构函数的 struct ?

在空表达式语句中移动的值

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题