Rust 静态链接使用regex_宏的二进制文件

Rust 静态链接使用regex_宏的二进制文件,rust,rust-cargo,Rust,Rust Cargo,我刚刚意识到,当我使用regex\u宏时,通过Cargo创建的Rust二进制文件是动态链接的。这有点问题,因为当我更新到更新版本的regex\u宏时,创建的二进制文件将停止工作 有办法吗 下面是一个简单的例子: #![feature(plugin)] #[plugin] extern crate regex_macros; fn main() {} 编译此文件并查看链接内容可以揭示以下内容: uh@macaron:~/linking-test (master)$ otool -L targ

我刚刚意识到,当我使用
regex\u宏时,通过Cargo创建的Rust二进制文件是动态链接的。这有点问题,因为当我更新到更新版本的
regex\u宏
时,创建的二进制文件将停止工作

有办法吗

下面是一个简单的例子:

#![feature(plugin)]
#[plugin]
extern crate regex_macros;


fn main() {}
编译此文件并查看链接内容可以揭示以下内容:

uh@macaron:~/linking-test (master)$ otool -L target/linking-test
target/linking-test:
    /Users/uh/linking-test/target/deps/libregex_macros-bdbdbfedad0748ac.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/librustc-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libflate-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libgetopts-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/librustc_back-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libsyntax-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libfmt_macros-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libarena-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libterm-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libgraphviz-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/librbml-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libserialize-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/liblog-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/librustc_llvm-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libstd-4e7c5e5c.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    /usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)

正如您所看到的,第一个链接的动态库有一个进入项目所在目录的绝对路径,即使执行
货物清理
也可能会破坏可执行文件。

我认为您错了,二进制文件是动态链接的(至少默认情况下不是这样)

我刚刚用Cargo(
Cargo new--bin foo
)创建了一个全新的二进制项目,添加了,并在源代码中使用了它。我编译了二进制文件,然后使用
otool
列出了动态库(我在OS X上):


这似乎表明,唯一的动态链接是到核心系统库(在Linux上,我相信是glibc)。

它们缺少的微小细节是
#[no_link]
,正如。因此,将代码更改为:

#![feature(plugin)]
#[plugin] #[no_link] extern crate regex_macros;


fn main() {}

将静态链接regex_宏板条箱。

哎呀,你说得对。你能展示一个最小可复制的示例,并提供足够的信息让其他人复制你的问题吗?好主意。我会试着找出一个最简单的例子。我在编译我的项目()时注意到了这一点,但是这个项目已经相当大了,当然不适合调试。是的,它就在文档中。。。谢谢!:)当我在我的项目()中执行时,我得到了很多输出,而您只得到了那一行。我将尝试给出一个最小的示例……”“静态链接regex_宏板条箱”-名为
#[no_link]
的属性不应该链接它吗?
#![feature(plugin)]
#[plugin] #[no_link] extern crate regex_macros;


fn main() {}