Я хотел бы построить динамическую библиотеку из программы Rust и связать ее с существующим проектом C ++.
Для проекта C ++ мы застряли на использовании gcc для компиляции (относительно старый gcc 4.8.2, но я также пытаюсь использовать gcc 7.3.0 с той же проблемой).
Это минимальный пример проблемы:
ЦСИ / 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
Я подозреваю, что проблема связана с искажением имен функций, но я не могу понять, как ее решить.
Есть идеи?