Как гарантировать совместимость ABI для библиотеки C++, предоставляющей сторонние типы (fmt) в заголовках с помощью ConaC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как гарантировать совместимость ABI для библиотеки C++, предоставляющей сторонние типы (fmt) в заголовках с помощью Cona

Сообщение Anonymous »

Я разрабатываю библиотеку C++ (), использующий сторонние библиотеки (в частности, fmt). Моя библиотека состоит из общедоступных заголовков и предварительно скомпилированных двоичных файлов.
Ограничение:
Я должен распространять MyLib внутри компании среди других команд только как предварительно скомпилированный двоичный файл.
  • Потребители не могут перекомпилировать MyLib из исходного кода.
  • Если предварительно созданный двоичный файл, соответствующий их конфигурации, не существует, процесс должен завершиться неудачей, а не пытаться его создать.
Архитектура:
  • предоставляет доступ к сторонним библиотекам, например вводит свой общедоступный API (заголовки).
  • компилируется в статическую/общую библиотеку с использованием определенной версии fmt (например, v9.1.0) и определенных флагов компилятора.
  • Потребительское приложение связывает MyLib через Conan. Конан получит MyLib (двоичный) и fmt (источник для сборки, если он недоступен или двоичный).
Страх:
Даже если я заставлю Потребителя использовать тот же номер версии fmt (v9.1.0), меня беспокоят небольшие различия в том, как fmt построен на их основе. сторона. Если fmt скомпилирован с немного другими параметрами, расположение типов в моих заголовках в памяти не будет соответствовать предварительно скомпилированному двоичному файлу. Это может привести к неправильному отображению памяти и сбоям в автоматическом режиме.
**Пример сценария:
MyLib.h (Public Header)** Этот заголовок включается как в мою сборку библиотеки, так и в потребитель.

Код: Выделить всё

#pragma once
#include 

namespace mylib {
struct LogContext {
// The size/alignment of this member depends on how fmt was compiled.
fmt::memory_buffer buffer;
};

void process(LogContext& ctx);
}
Среда сборки MyLib: я создаю [/b] (и ссылка на [/b] v9.1.0). Конан генерирует

Код: Выделить всё

package_id
[/b] для этого двоичного файла.
Потребительская среда: Потребитель просит Конана

Код: Выделить всё

MyLib. Они также используют fmt
[/b] v9.1.0. Однако их проект, возможно, имеет небольшое изменение или должен быть перестроен fmt .
Если расположение памяти

Код: Выделить всё

fmt::memory_buffer
[/b] (или любой другой объект из моих сторонних библиотек) изменяется из-за условно скомпилированных членов, моего предварительно скомпилированного

Код: Выделить всё

process()Функция 
[/b] будет читать мусорную память при передаче потребителя.

Код: Выделить всё

LogContext
[/b].
Мои вопросы: Является ли вышеизложенное обоснованным беспокойством или у меня паранойя? Как другие справляются с подобными сценариями, если это серьезная проблема?

Подробнее здесь: https://stackoverflow.com/questions/798 ... arty-types
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»