Немодульные заголовки библиотеки OpenSSL при использовании modulemap для платформы Swift - PullRequest
4 голосов
/ 14 июня 2019

Я пытаюсь статически связать библиотеку OpenSSL с моей платформой Swift, используя XCode. Большинство подходов, упомянутых в Интернете, неверны, поскольку они предлагают использовать путь импорта (SWIFT_INCLUDE_PATHS). В результате двоичный файл платформы заблокирован в определенном месте в файловой системе, а сам двоичный файл не является переносимым. Хотя это еще не конец света, я все же хотел бы иметь возможность распространять бинарный файл, например, через Карфаген, и следующий вышеупомянутый подход не позволяет этого.

Я попытался создать свою собственную карту модулей с зонтичным заголовочным файлом для платформы и включил библиотеку OpenSSL в качестве явного модуля, следуя подходам, описанным в статьях, подобных этим: https://badootech.badoo.com/bundling-c-library-in-swift-framework-3d9dae950774

Это мой файл карты модулей, путь которого я вставил в переменную MODULEMAP_FILE build config.

framework module MyFramework {
    umbrella header "MyFramework.h"
    requires objc

    export *
    module * { export * }

    module COpenSSL [system] {
        header "shim.h"
        link "ssl"
        link "crypto"
        export *
    }
}

где shim.h file - заголовочный файл, который выглядит следующим образом:

#ifndef __COPENSSL_SHIM_H__
#define __COPENSSL_SHIM_H__

#include <openssl/conf.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/md4.h>
#include <openssl/md5.h>
#include <openssl/sha.h>
#include <openssl/hmac.h>
#include <openssl/rand.h>
#include <openssl/ripemd.h>
#include <openssl/pkcs12.h>
#include <openssl/x509v3.h>

__attribute__((swift_name("SSL_set_tlsext_host_name(_:_:)")))
static inline int shim_SSL_set_tlsext_host_name(const SSL *s, const char *name) {
    return SSL_set_tlsext_host_name(s, name);
};

#endif

Проблема здесь в том, что я получаю ошибки при попытке скомпилировать проект о включении немодульных заголовков.

Я попытался включить все файлы заголовков в проект XCode как общедоступные файлы заголовков (conf.h, evp.h и т. Д., Все они). Но проблема все еще сохраняется, возможно потому, что он не может работать с синтаксисом включения заголовка #include <openssl/conf.h>. Изменение включений на #include "conf.h" и т. Д. Работает, но тогда тот же стиль включения заголовков используется с conf.h и всеми другими заголовочными файлами, которые поступают из библиотеки Open SSL, так что это не очень помогает.

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

Есть ли способ не включать эти заголовки в проект XCode, чтобы они по-прежнему работали с исходным синтаксисом #include <openssl/conf.h>?

Я пытался задать HEADER_SEARCH_PATHS путь, по которому относительный путь к каждому заголовку равен openssl/conf.h и т. Д., Но это никак не помогло.

Спасибо.

1 Ответ

0 голосов
/ 18 июня 2019

Можете ли вы отправить журнал сборки с ошибкой?
Какую версию библиотеки OpenSSL вы используете?
Можете ли вы попробовать https://github.com/krzyzanowskim/OpenSSL? У него нет ошибок с немодульными заголовками

...