2016-01-08 15 views
5

Skompilowałem libdispatch. Ten kod działa:Swift w systemie Linux: użycie nierozwiązanego identyfikatora "dispatch_async"

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

Ale jeśli mogę umieścić ten kod do końca pliku:

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

mam błąd: to wydaje się

use of unresolved identifier 'dispatch_async'

+2

Jaka jest mapa modułu, za pomocą której pobierasz bibliotekę libdispatch do Swift? Czy używasz menedżera pakietów? –

+0

Używam oficjalnego modułu: https://github.com/apple/swift-corelibs-libdispatch yes, działa pierwszy blok kodu. działa "import Dispatch" i "dispatch_queue_create". – zig1375

+2

Brzmi to w związku z tym problemem: https://bugs.swift.org/browse/SR-397, gdzie każda funkcja wywoływania funkcji libdispatch blokuje potrzeby. Wygląda na to, że menedżer pakietów Swift musi obsługiwać niestandardowe flagi kompilatorów dla modułów, aby to działało. –

Odpowiedz

3

Jak zauważył powyżej być a current limitation with the Swift Package Manager. Obecnie nie obsługuje dodawania odpowiednich opcji kompilacji, takich jak te potrzebne do obsługi bloków jako wejść do funkcji GCD (-Xcc -fblocks).

W międzyczasie można uniknąć Menedżera pakietów Swift i skompilować pliki bezpośrednio za pomocą swiftc z odpowiednimi opcjami. Przykładem jest przez Sheffler w their test repository:

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 

W -I opcje będą ciągnąć w swoich mapach moduł do libdispatch, tak wyregulować, aby dopasować te gdzie masz faktycznie umieszczone tych katalogów modułów systemu.

Powiązane problemy