2016-01-08 3 views
5

Я собрал libdispatch. Этот код работает:Swift in Linux: использование неразрешенного идентификатора 'dispatch_async'

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

Но если я ставлю этот код в конец файла:

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

я получил ошибку:

use of unresolved identifier 'dispatch_async'

+2

Какова карта модуля, которую вы используете, чтобы вытащить libdispatch в Swift? Вы используете диспетчер пакетов? –

+0

Я использую официальный модуль: https://github.com/apple/swift-corelibs-libdispatch да, первый блок кода работает. 'import Dispatch' и' dispatch_queue_create' работают. – zig1375

+2

Это звучит по этой проблеме: https://bugs.swift.org/browse/SR-397, где любая функция libdispatch вызывает необходимость блокировки блоков. Похоже, Менеджер Swift Package Manager должен поддерживать пользовательские флаги компилятора для модулей, чтобы это работало. –

ответ

3

Как я заметил выше, это, как представляется, be a current limitation with the Swift Package Manager. В настоящее время он не поддерживает добавление соответствующих параметров времени компиляции, таких как те, которые необходимы для поддержки блоков в качестве входных данных для функций GCD (-Xcc -fblocks).

В то же время вы можете избежать диспетчера пакетов Swift и скомпилировать файлы напрямую с помощью swiftc с соответствующими параметрами. Пример обеспечивается sheffler в 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 

В -I вариантах будут тянуть в ваших картах модуля для libdispatch, поэтому настроить те, чтобы соответствовать, где вы на самом деле поместили эти модульные системы каталогов.

Смежные вопросы