Swift: не удается найти функцию в импортированной библиотеке c - PullRequest
0 голосов
/ 29 декабря 2018

Я грызу кости за прошедший день и не могу найти решения.

Я создаю быструю оболочку для cfitsio, которая подходит для астрономов:

https://heasarc.gsfc.nasa.gov/fitsio/

Я создал простую оболочку swift для доступа к описанному выше как cFitsIO в виде модуля, следуя инструкциям ниже: https://www.hackingwithswift.com/articles/87/how-to-wrap-a-c-library-in-swift

Когда яВыполните быстрый запуск файла main.swift оболочки, я вижу, что импорт выполнен успешно, но одна из функций, fits_open_file, не может быть решена.Причина, по которой я говорю, что импорт работает, заключается в том, что swift предлагает другую функцию, которая находится в библиотеке c в качестве альтернативы.

На странице cfitsio сказано, что она включает только fitsio.h, поэтому я ожидаю, что все функции будутоттуда вызывается.

Однако после клонирования GitHub и выполнения некоторого grep я не могу найти никакой сигнатуры для функции fits_open_file.

еще одна вещь, когда я создаю оболочку swift, я использую pig-config --type system-module, поскольку я также могу загрузить cfitsio через brew, который помещает его в папку /usr/local/include моей системы.

Iчитайте где-нибудь еще о том, что Xcode не находит должным образом вложенные заголовки, по следующей ссылке, но у fitsio есть много заголовочных файлов, некоторые с константами, некоторые с макросами и т. д. Я бы ожидал более чистый способ выполнения этого импорта, чем утомительный просмотр каждого из них.заголовочный файл должен иметь?

https://medium.com/shopify-mobile/wrapping-a-c-library-in-swift-part-1-6dd240070cef

1 Ответ

0 голосов
/ 03 января 2019

После быстрого просмотра исходного кода, предоставленного на сайте nasa.gov, на который вы ссылались, можно увидеть, что fits_open_file на самом деле является макросом, определенным в longnam.h как вызов ffopentest.Заголовок longnam.h включен в fitsio.h, поэтому макрос будет доступен, если он будет использоваться в коде C / C ++.

Проблема в том, что Swift автоматически импортирует только простые макросы, подобные константе, см. Этот документ Apple: https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/using_imported_c_macros_in_swift.

Вот соответствующая статья SO: Доступ к Cмакросы в Swift

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...