将从Rust编译的动态库与gcc链接

时间:2019-03-07 11:24:32

标签: c++ gcc rust

我想从Rust程序构建一个动态库,并将其链接到现有的C ++项目。 对于C ++项目,我们一直坚持使用gcc进行编译(相对较旧的gcc 4.8.2,但我也尝试使用gcc 7.3.0并存在相同的问题)。

这是问题的最小示例:

src / lib.rs

#[no_mangle]
pub unsafe extern "C" fn hello() {
  println!("Hello World, Rust here!");
}

Cargo.toml

[package]
name = "gcc-linking"
version = "0.1.0"
authors = ..
edition = "2018"

[lib]
crate-type = ["dylib"]

[dependencies]

hello.cpp:

extern "C" void hello();

int main() {

    hello();
    return 0;
}

现在,当我与clang链接时,一切都很好:

cargo build --lib
clang -L target/debug -l gcc_linking hello.cpp -o hello
LD_LIBRARY_PATH=target/debug:$LD_LIBRARY_PATH ./hello

如预期的那样,将导致:

Hello World, Rust here!

但是,如果我尝试将其与gcc链接,则会出现以下链接错误:

gcc -L target/debug -l gcc_linking hello.cpp -o hello

输出:

/tmp/ccRdGJOK.o: In function `main':
hello.cpp:(.text+0x5): undefined reference to `hello'
collect2: error: ld returned 1 exit status

查看动态库:

# objdump -T output
0000000000043f60 g    DF .text  0000000000000043  Base        hello
# nm -gC output
0000000000043f60 T hello

我怀疑问题与函数名称的修饰有关,但我不知道如何解决。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

按照@Jmb的建议,解决方案是将参数的顺序更改为gcc并在C ++文件之后的之后列出共享库:

gcc -L target/debug hello.cpp -l gcc_linking -o hello