我对link
属性如何轻松地链接共享库印象深刻。然而,我对该属性的详细信息以及它与C语言中的链接方式进行比较很感兴趣。例如,考虑以下Rust代码:
#[allow(bad_style)]
struct wl_display;
fn main() {
#[link(name="wayland-client", kind="dylib")]
extern {
fn wl_display_connect(name: *const u8) -> *mut wl_display;
}
// do work
}
它是否更接近以下C代码的翻译?
#include <stdio.h>
#include <dlfcn.h>
struct wl_display;
int main() {
struct wl_display* (*pwl_display_connect)(const char *name);
char* error;
void* handle = dlopen("/usr/lib/libwayland-client.so", RTLD_LAZY);
if(!handle) {
fprintf(stderr, "Error opening lib: %s\n", dlerror());
exit(1);
}
pwl_display_connect = dlsym(handle, "wl_display_connect");
// do work
if(!pwl_display_connect) {
fprintf(stderr, "Error loading function: %s\n", dlerror());
exit(1);
}
if(dlclose(handle) < 0) {
fprintf(stderr, "Error closing lib: %s\n", dlerror());
exit(1);
}
return 0;
}
编译时使用了 with。
clang -o test test.c -ldl # or your cc of choice
我需要翻译的内容:
或者它会被翻译成类似于使用 clang <other stuff> -lwayland-core
吗?还是我完全错误,走错了方向?
以下是我从阅读 The Rust Reference 中找到的唯一文档。
link
- 表示本块中的声明需要正确链接到本地库。link
支持一个可选的kind
键,有三个可能的值:dylib
、static
和framework。
编辑:
The Rust Programming Language 在 高级链接 下提供了更多信息。
ldd your-exe
进行比较。C版本肯定不会报告对libwayland-client
的依赖关系——那么Rust版本呢? - John ZwinckRTLD_LAZY
,它意味着“在执行动态库代码时解析未定义的符号”。这是从以下文档这里中获取的。由于这只是一个例子,所以我没有使用pwl_display_connect
。因此,如果您使用RTLD_NOW
,它可能会报告依赖项,但我可能是错的。 - Daniel RobertsonRTLD_NOW
,C程序也不会静态依赖于libwayland-client
。 - John Zwinck-l<name>
。谢谢! - Daniel Robertson