2015-07-01 2 views
21

Ich habe eine bestehende C++/Qt project gebaut mit CMake. Ich möchte anfangen, Rost-Code hinzuzufügen, den ich innerhalb der Haupt-C++ Codebasis aufrufen kann.Wie kann ich Rust-Code mit einem C++/Qt/CMake-Projekt erstellen?

Was ist der richtige Weg, um das Projekt zu strukturieren?

Aktuelle Projektstruktur:

./CMakeLists.txt 
./subproject-foo/CMakeLists.txt 
./subproject-foo/src/... 
./subproject-bar/CmakeLists.txt 
./subproject-bar/src/... 
./common/CMakeLists.txt 
./common/src/... 

Ich möchte ein common-rust/... Verzeichnis mit ähnlicher Struktur hinzuzufügen.

Wie kann ich das in das Projekt integrieren?

+0

Können Sie 'Fracht' verwenden? Wenn dem so ist, würde ich vorschlagen, Regeln zu haben, die Cargo anrufen. – Shepmaster

Antwort

29

Sie können dazu die ExternalProject module verwenden. Es wurde entwickelt, um externe Abhängigkeiten aufzubauen - auch solche, die CMake nicht verwenden. Hier ist ein useful article auf die Verwendung.

So sagen, Sie haben Ihre "Common-Rost" Unterverzeichnis und seine Cargo.toml enthält:

[package] 
name = "rust_example" 
version = "0.1.0" 

[lib] 
name = "rust_example" 
crate-type = ["staticlib"] 

und es macht eine Funktion add über seine lib.rs:

#[no_mangle] 
pub extern fn add(lhs: u32, rhs: u32) -> u32 { 
    lhs + rhs 
} 

dann Ihre Top-Level CMakeLists.txt könnte etwa so aussehen:

Wenn Sie bauen Das Rust-Ziel als staticlib gibt aus, welche anderen Bibliotheken verknüpft werden sollen. Ich habe das nur unter Windows versucht, daher sind ws2_32, userenv und advapi32 verknüpft. Dies wird offensichtlich nicht plattformübergreifend sein, aber Sie können das leicht genug handhaben (z.B. eine Variable auf die Liste von Abhängigkeiten setzen, die für jede Plattform innerhalb eines if..else Blocks geeignet sind, und diese an den Aufruf target_link_libraries anhängen).

Beachten Sie auch, dass dies davon abhängt, dass Cargo im Pfad verfügbar ist.

Sie sollten jetzt gut gehen. Die Datei "CPP/main.cpp" könnte enthält so etwas wie:

#include <cstdint> 
#include <iostream> 

extern "C" { 
    uint32_t add(uint32_t lhs, uint32_t rhs); 
} 

int main() { 
    std::cout << "1300 + 14 == " << add(1300, 14) << '\n'; 
    return 0; 
} 

Hier ist ein Link zu einem Arbeits example project.

+0

Wow, was für eine umfassende Antwort. Danke vielmals! – Daenyth

+0

Ja - keine Sorge. Es war eine interessante Frage und ich wollte sehen, wie es funktionieren würde :) – Fraser

+0

Danke, das hat mir gerade eine Menge Zeit gespart! –

Verwandte Themen