2016-11-27 22 views
3

私はlibsoundioとRustプログラムをリンクしようとしています。私はWindowsを使用しており、GCCバイナリダウンロードが利用可能です。Rustでリンカーパスを指定する方法を教えてください。

#[link(name = ":libsoundio-1.1.0/i686/libsoundio.a")] 
#[link(name = "ole32")] 
extern { 
    fn soundio_version_string() -> *const c_char; 
} 

しかし、私は本当に#[link(name = "libsoundio")]あるいは#[link(name = "soundio")]を指定し、どこか他のリンカ・パスを提供したい:私は私のプロジェクトと同じフォルダに入れた場合、私はこのようにそれをリンクすることができます。

どこでそのパスを指定できますか?

次のように私はrustc-link-searchの提案を試してみました:

#[link(name = "libsoundio")] 
#[link(name = "ole32")] 
extern { 
    fn soundio_version_string() -> *const c_char; 
} 

そして.cargo/config中を:

[target.i686-pc-windows-gnu.libsoundio] 
rustc-link-search = ["libsoundio-1.1.0/i686"] 
rustc-link-lib = ["libsoundio.a"] 

[target.x86_64-pc-windows-gnu.libsoundio] 
rustc-link-search = ["libsoundio-1.1.0/x86_64"] 
rustc-link-lib = ["libsoundio.a"] 

しかし、それはまだだけではgccに"-l" "libsoundio"を渡し、同じld: cannot find -llibsoundioで失敗します。本当に明白な何かが欠けていますか?ドキュメントによって、これはうまくいくはずです。 rustc

答えて

0

-L-lを使用します。documentation for a build scriptに述べたように-lsoundio

+0

たぶん私は何かが欠けていますが、それは動作するようには思えません。私の質問編集を参照してください。 – Timmmm

+0

接頭辞 "lib"を削除しようとしてください: '-l soundio' – Lud

+0

効果がありません。' .cargo/config'を使用していないようです。私はそれが '.libsoundio 'ビットと関係があると思うが、Cargoにビルド設定を表示させてデバッグするのは難しいようだ。 – Timmmm

6

:あなたは接頭辞libとあなたの静的ライブラリの拡張.aを捨てるべき-l

$ rustc --help 
... 
-L [KIND=]PATH  Add a directory to the library search path. The 
        optional KIND can be one of dependency, crate, native, 
        framework or all (the default). 
-l [KIND=]NAME  Link the generated crate(s) to the specified native 
        library NAME. The optional KIND can be one of static, 
        dylib, or framework. If omitted, dylib is assumed. 
... 

注意、

すべての行printe dをstdoutでビルドスクリプト[... starting]でcargo:と解釈すると、Cargo [...]によって直接解釈されますrustc-link-searchは、指定された値が-Lフラグとしてコンパイラに渡されるべきであることを示します。

[package] 
name = "link-example" 
version = "0.1.0" 
authors = ["An Devloper <[email protected]>"] 
build = "build.rs" 

そして、あなたのbuild.rs:ビルドスクリプトは、錆のすべての電源を使用してことができ

fn main() { 
    println!(r"cargo:rustc-link-search=C:\Rust\linka\libsoundio-1.1.0\i686"); 
} 

注意ごCargo.toml

ターゲットプラットフォーム(32ビットや64ビットなど)に応じて異なる値を出力します。

は最後に、あなたのコード:

extern crate libc; 

use libc::c_char; 
use std::ffi::CStr; 

#[link(name = "soundio")] 
extern { 
    fn soundio_version_string() -> *const c_char; 
} 

fn main() { 
    let v = unsafe { CStr::from_ptr(soundio_version_string()) }; 
    println!("{:?}", v); 
} 

証拠はプディングである:

$ cargo run 
    Finished debug [unoptimized + debuginfo] target(s) in 0.0 secs 
    Running `target\debug\linka.exe` 
"1.0.3" 

理想的には、あなたがthe convention for *-sys packagesを使用して、soundio-sysパッケージを作成します。これには、適切なライブラリにリンクしてCのメソッドを公開するビルドスクリプトがあります。 Cargo links keyを使用してネイティブライブラリを一意に識別し、ネイティブライブラリへのリンクを複数回防止します。他のライブラリにはこの新しいクレートが含まれていて、リンクの詳細について心配する必要はありません。

2

私はOK働く何かを見つける:あなたのCargo.tomllinksを指定することができます。

[package] 
links = "libsoundio" 
build = "build.rs" 

これはlibsoundioへのプロジェクトリンクすることを指定します。

[target.i686-pc-windows-gnu.libsoundio] 
rustc-link-search = ["libsoundio-1.1.0/i686"] 
rustc-link-lib = [":libsoundio.a"] 

[target.x86_64-pc-windows-gnu.libsoundio] 
rustc-link-search = ["libsoundio-1.1.0/x86_64"] 
rustc-link-lib = [":libsoundio.a"] 

(。:プレフィックスは実際のファイル名を使用すると、そのすべてのばかげたlib -prependingと拡張子魔法をしないGCCに指示します)

:今、あなたは .cargo/configファイルの検索パスとライブラリ名を指定することができます

はまたbuild.rs空作成する必要があります。.cargo/configの値はその出力をオーバーライドするので、

fn main() {} 

このファイルが実行されることはありませんが、いくつかreaso用n貨物には依然としてそれが必要です。links =を使用する場合は、使用しなくてもbuild =が必要です。 main.rsで最後に

#[link(name = "libsoundio")] 
#[link(name = "ole32")] 
extern { 
    fn soundio_version_string() -> *const c_char; 
} 
+0

ありがとう!ターゲットの名前を取得するにはどうすればいいですか(私はMacとLinuxを使用しています)。 '.cargo/config'をバージョン管理にコミットするのか、それともすべての開発者が違うのでしょうか? – Envek

+0

ターゲットは錆びてしまいます。 'rustup show'を実行します。 (あるいは、 'cargo --target blah'のようなものでデフォルトを上書きすることもできます)' .cargo/config'はバージョンコントロールでなければなりません。しかし、ほとんどの人は、 '.cargo/config'ではなく、空でない' build.rs'を使ってこのようにしているようです。 – Timmmm

関連する問題