2017-01-29 13 views
1

Я создаю обертку Rust вокруг библиотеки C. Я поместил библиотеки C в каталоге lib и я использую build.rs сказать компилятору, где найти библиотеки, чтобы связать с:Как сделать поиск rustc-link относительно местоположения проекта?

println!("cargo:rustc-link-lib=static=wrapped-lib"); 
println!(r"cargo:rustc-link-search=lib\"); 

Это прекрасно работает, когда я построить библиотеку, но ниже по течению библиотеки, которые зависят на обертке библиотеки получили отказы компиляции:

error: could not find native static library `wrapped-lib`, perhaps an -L flag is missing? 

проблема, кажется, с:

println!(r"cargo:rustc-link-search=lib\"); 

When compilin Клиентская библиотека га, это не указывает на repository\checked_out_project\lib, но вместо этого, кажется, глядя на местном уровне, так как указав абсолютный путь в зависимости работы:

println!(r"cargo:rustc-link-search=C:\users\id\.cargo\..\lib\"); 

Я также поручил Cargo включить каталог lib в обертке-Lib следующим образом:

include = ["lib/**/*"] 

Как сообщить компилятору, что он выглядит относительно зависимости, а не создаваемого проекта? Я думал, что это должно работать:

println!(r"cargo:rustc-link-search=lib\"); 

ответ

2

Вручную.

Хорошим примером является ящик winapi. Он имеет пару подъярусов для библиотек импорта, каждый из которых имеет скрипт сборки и каталог lib. build script for the i686 crate содержит:

use std::path::Path; 
use std::env; 

fn main() { 
    let dir = env::var("CARGO_MANIFEST_DIR").unwrap(); 
    println!("cargo:rustc-link-search=native={}", Path::new(&dir).join("lib").display()); 
} 
+0

Этот вызов 'display' кажется неудачным. Интересно, есть ли способ избежать этого ... – Shepmaster

+0

@Shepmaster Если Cargo не разбирает скрипт скрипта сборки как необработанные двоичные данные, это не имеет значения. Чтобы избежать «отображения», вам также необходимо избегать всех стандартных форматирования и вывода на основе строк. –

+0

Я имею в виду, я уверен, что авторы Cargo беседовали с авторами Rust (потому что они одни и те же люди), а авторы Rust - это те, кто создал «Path» и «PathBuf», чтобы быть отделенными от '& str' и' String'. Я бы надеялся (но не задерживал бы дыхание), что Cargo делает немного сложнее. Вам не пришлось бы оставлять все правильное форматирование, хотя бы для переменных, которые в нем нуждались. Также жаль, что нет никакой очевидной «паники», если путь не может быть отображен в формате, что может вызвать любые ошибки, которые я переживаю, чтобы произойти очевидным образом. – Shepmaster

 Смежные вопросы

  • Нет связанных вопросов^_^