我已经用 C 包装器编写了一个 C++ 库,并想从我的 Rust 项目中调用这些函数。然而,当我尝试将我的 Rust 项目链接到 C 库时,我收到了一个很长的错误,并带有注释
\n\n note: /usr/bin/ld: cannot find -l../cpp_library/build/libdisplay.so\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\nCMakeLists.txt
\n\ncmake_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})\nRun Code Online (Sandbox Code Playgroud)\n\n显示.h
\n\nextern "C" {\n void display();\n}\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n主程序
\n\n#include "display.h"\n\nint main() {\n display();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n构建.rs
\n\nfn main() {\n println!("cargo:rustc-link-search=../cpp_library/build/");\n println!("cargo:rustc-link-lib=../cpp_library/build/libdisplay.so");\n}\nRun Code Online (Sandbox Code Playgroud)\n\n主程序.rs
\n\nextern {\n fn display();\n}\n\nfn main() {\n println!("Hello, world!");\n unsafe {\n display();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n您还可以在 Github 上查看该项目。
\n\n我用以下命令构建了 C 库
\n\ncd cpp_library\nmkdir build\ncd build\ncmake ..\nmake\nRun Code Online (Sandbox Code Playgroud)\n\n当我构建 Rust 项目时,我收到上面显示的错误。
\n\n我该如何将 C 库链接到 Rust 项目?
\n\n更新1
\n\n帖子如何在 Rust 中指定链接器路径?我应该在哪里放置静态库以便可以将其与 Rust 程序链接?指示如何将目录添加到库搜索路径并链接库。我已经尝试过这些解决方案,但仍然收到上述错误。
\n\n按照将Rust 应用程序与不在运行时链接器搜索路径中的动态库链接的建议,我编译了 rust 项目
\n\ncargo rustc -- -C link-args=\'-Wl,-rpath,$ORIGIN/../../../cpp_library/build/\'\nRun Code Online (Sandbox Code Playgroud)\n\n但收到同样的错误。我也尝试传递绝对路径并收到相同的结果。
\n\n我删除了多余的#[link(name = "display")],但这并没有解决问题。
| 归档时间: |
|
| 查看次数: |
3391 次 |
| 最近记录: |