Связывание динамической библиотеки, скомпилированной из Rust, с помощью gcc - PullRequest
3 голосов
/ 07 марта 2019

Я хотел бы построить динамическую библиотеку из программы 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

Я подозреваю, что проблема связана с искажением имен функций, но я не могу понять, как ее решить.

Есть идеи?

1 Ответ

0 голосов
/ 13 марта 2019

Как и предполагал @Jmb, решение состояло в том, чтобы изменить порядок аргументов на gcc и перечислить разделяемую библиотеку после файла C ++:

gcc -L target/debug hello.cpp -l gcc_linking -o hello
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...