2016-01-08 12 views
5

Ich kompilierte libdispatch. Dieser Code funktioniert:Swift in Linux: Verwendung der unaufgelösten Kennung 'dispatch_async'

import Dispatch 
var lockQueue = dispatch_queue_create("com.test.async", nil); 

Aber wenn ich diesen Code setzen Datei zu beenden:

dispatch_async(lockQueue) { 
    print("test1"); 
} 

Ich habe einen Fehler:

use of unresolved identifier 'dispatch_async'

+2

Was ist die Modulkarte, die Sie verwenden, um libdispatch zu Swift zu ziehen? Verwenden Sie den Paketmanager? –

+0

Ich benutze offizielle Modul: https://github.com/apple/swift-corelibs-libdispatch ja, erste Code-Block funktioniert. 'import Dispatch' und' dispatch_queue_create' funktionieren. – zig1375

+2

Das klingt nach diesem Problem: https://bugs.swift.org/browse/SR-397 wo alle libdispatch-Funktionsaufrufe, die Blöcke benötigen, nicht gefunden werden. Es klingt wie der Swift Package Manager in der Lage sein muss, benutzerdefinierte Compiler-Flags für Module zu unterstützen, damit dies funktioniert. –

Antwort

3

Wie ich oben bemerkte, scheint dies zu sei a current limitation with the Swift Package Manager. Es unterstützt derzeit nicht das Hinzufügen der entsprechenden Kompilierungszeitoptionen, z. B. diejenigen, die benötigt werden, um Blöcke als Eingaben für GCD-Funktionen zu unterstützen (-Xcc -fblocks).

In der Zwischenzeit können Sie den Swift Package Manager umgehen und Ihre Dateien direkt mit swiftc mit den entsprechenden Optionen kompilieren. Ein Beispiel dafür ist Sheffler in their test repository bereitgestellt:

swiftc -v -o gcd4 Sources/main.swift -I .build/debug -j8 -Onone -g -Xcc -fblocks -Xcc -F-module-map=Packages/CDispatch-1.0.0/module.modulemap -I Packages/CDispatch-1.0.0 -I /usr/local/include 

Die -I Optionen in Ihrem Modul Karten für libdispatch ziehen, so dass diejenigen einstellen, an dem Sie tatsächlich diese Systemmodul Verzeichnisse platziert haben.