2016-01-08 4 views
5

J'ai compilé libdispatch. Ce code fonctionne:Swift sous Linux: utilisation de l'identificateur non résolu 'dispatch_async'

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

Mais si je mets ce code à la fin du fichier:

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

je me suis une erreur:

use of unresolved identifier 'dispatch_async'

+2

Quelle est la carte du module que vous utilisez pour insérer libdispatch dans Swift? Utilisez-vous le gestionnaire de paquets? –

+0

J'utilise le module officiel: https://github.com/apple/swift-corelibs-libdispatch oui, le premier bloc de code fonctionne. 'import Dispatch' et' dispatch_queue_create' fonctionnent. – zig1375

+2

Cela semble lié à ce problème: https://bugs.swift.org/browse/SR-397 où les appels de fonctions libdispatch qui ont besoin de blocs ne sont pas trouvés. Il semble que le gestionnaire de paquets Swift doit être en mesure de prendre en charge les indicateurs de compilation personnalisés pour les modules pour que cela fonctionne. –

Répondre

3

Comme je l'ai fait remarquer ci-dessus, il semble être a current limitation with the Swift Package Manager. Il ne prend actuellement pas en charge l'ajout des options de compilation appropriées, telles que celles nécessaires pour prendre en charge les blocs en tant qu'entrées de fonctions GCD (-Xcc -fblocks).

En attendant, vous pouvez éviter le gestionnaire de paquets Swift et compiler vos fichiers directement en utilisant swiftc, avec les options appropriées. Un exemple est fourni par Sheffler dans 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 

Les -I options tirer dans vos cartes de module pour libdispatch, afin d'ajuster ceux match où vous avez réellement placé ces répertoires de modules du système.