Я пытаюсь создать динамическую библиотеку в Rust, которая экспортирует структуру как символ, который будет загружен в программу на языке C через dlopen().Создание статической структуры C, содержащей строки
Тем не менее, я сталкивался с некоторыми проблемами при доступе ко второй строке в структуре, поэтому я сделал небольшую пробную программу, чтобы попытаться выяснить, что я делаю неправильно.
Это код Rust (test.rs), составленный с "rustc --crate типа dylib test.rs":
#[repr(C)]
pub struct PluginDesc {
name: &'static str,
version: &'static str,
description: &'static str
}
#[no_mangle]
pub static PLUGIN_DESC: PluginDesc = PluginDesc {
name: "Test Plugin\0",
version: "1.0\0",
description: "Test Rust Plugin\0"
};
и здесь является программа C, которая пытается загрузить библиотеку (test.c), составленный с "GCC test.c -ldl -o тест":
#include <dlfcn.h>
#include <stdio.h>
typedef struct {
const char *name;
const char *version;
const char *description;
} plugin_desc;
int main(int argc, char **argv) {
void *handle;
plugin_desc *desc;
handle = dlopen("./libtest.so", RTLD_LOCAL | RTLD_LAZY);
if (!handle) {
printf("failed to dlopen: %s\n", dlerror());
return 1;
}
desc = (plugin_desc *) dlsym(handle, "PLUGIN_DESC");
if (!desc) {
printf("failed to dlsym: %s\n", dlerror());
return 1;
}
printf("name: %p\n", desc->name);
printf("version: %p\n", desc->version);
printf("description: %p\n", desc->description);
return 0;
}
Это выход:
name: 0x7fa59ef8d750
version: 0xc
description: 0x7fa59ef8d75c
Как вы можете видеть, объявление dress of desc-> version - это фактически 0xc (12), которая является длиной первой строки. Таким образом, похоже, что структура, которая упакована в библиотеку, также содержит длину строки после адреса памяти.
Я использую здесь неправильный тип строки? Как вы можете видеть, мне пришлось также сделать строки NULL завершенными вручную. Я попытался использовать оболочку CString, но в этом случае это не работает («статическим элементам не разрешено иметь деструкторы»).
Я бегу последнюю Rust каждую ночь на Linux:
$ rustc --version
rustc 0.12.0-pre-nightly (f8426e2e2 2014-09-16 02:26:01 +0000)
Вы пробовали положить '* i8' указатели на структуры вместо этого? – nneonneo
Похоже, что ржавые строки - это не просто 'char *'. Есть ли .h-файл, содержащий определение строк ржавчины для связывания с C? – EOF