Я пытаюсь статически связать библиотеку 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
и т. Д., Но это никак не помогло.
Спасибо.