如何在 Rust 中调用共享库?

pdi*_*ley 5 c c++ ffi rust

我已经用 C 包装器编写了一个 C++ 库,并想从我的 Rust 项目中调用这些函数。然而,当我尝试将我的 Rust 项目链接到 C 库时,我收到了一个很长的错误,并带有注释

\n\n
  note: /usr/bin/ld: cannot find -l../cpp_library/build/libdisplay.so\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试将绝对路径传递给库并收到类似的错误。

\n\n

我的组合项目有以下目录和内容

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cpp_library\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 include\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 display.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 display.cpp\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.cpp\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rust_project\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.rs\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.lock\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n    \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.rs\n
Run Code Online (Sandbox Code Playgroud)\n\n

CMakeLists.txt

\n\n
cmake_minimum_required(VERSION 3.1.0)\nproject(directory_test)\nset(CMAKE_BUILD_TYPE Release)\n\n#Bring the headers into the project\ninclude_directories(include)\n\n\nset(SOURCES "src/display.cpp")\n\n#Generate the shared library from the sources\nadd_library(display SHARED ${SOURCES})\nadd_executable(display_test "src/main.cpp" ${SOURCES})\n
Run Code Online (Sandbox Code Playgroud)\n\n

显示.h

\n\n
extern "C" {\n    void display();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

显示.cpp

\n\n
#include <iostream>\n#include "display.h"\n\nvoid display(){\n    std::cout << "A C++ println" << std::endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

主程序

\n\n
#include "display.h"\n\nint main() {\n    display();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

构建.rs

\n\n
fn main() {\n    println!("cargo:rustc-link-search=../cpp_library/build/");\n    println!("cargo:rustc-link-lib=../cpp_library/build/libdisplay.so");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

主程序.rs

\n\n
extern {\n    fn display();\n}\n\nfn main() {\n    println!("Hello, world!");\n    unsafe {\n        display();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您还可以在 Github 上查看该项目

\n\n

我用以下命令构建了 C 库

\n\n
cd cpp_library\nmkdir build\ncd build\ncmake ..\nmake\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我构建 Rust 项目时,我收到上面显示的错误。

\n\n

我该如何将 C 库链接到 Rust 项目?

\n\n

更新1

\n\n

帖子如何在 Rust 中指定链接器路径?我应该在哪里放置静态库以便可以将其与 Rust 程序链接?指示如何将目录添加到库搜索路径并链接库。我已经尝试过这些解决方案,但仍然收到上述错误。

\n\n

按照将Rust 应用程序与不在运行时链接器搜索路径中的动态库链接的建议,我编译了 rust 项目

\n\n
cargo rustc -- -C link-args=\'-Wl,-rpath,$ORIGIN/../../../cpp_library/build/\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

但收到同样的错误。我也尝试传递绝对路径并收到相同的结果。

\n\n

我删除了多余的#[link(name = "display")],但这并没有解决问题。

\n

归档时间:

查看次数:

3391 次

最近记录:

5 年,9 月 前