Смешивание stdc++ и libc++ в проекте iOS

Мне трудно настроить проект iOS, в котором используется статическая библиотека, связанная со старой libstdС++, которую использовал gcc. Эта библиотека бывает 32- и 64-битной.

Есть 6 библиотек (например, libssl.a), которые являются 32-разрядными и должны быть обновлены. Если я скомпилирую эти библиотеки из исходного кода, они будут автоматически связаны с libc++, что приведет к жалобам моего компоновщика.

Поэтому вот мои вопросы:

1) Есть ли способ, чтобы одна статическая библиотека внутри проекта использовала libstdc++, а остальные использовали libc++?

2) Как я могу скомпилировать библиотеки из исходников (например, libcrypto и libssh) и заставить их использовать старую стандартную библиотеку libstdc++?

3) Есть ли другой выход из этой неразберихи?


person csotiriou    schedule 26.09.2015    source источник


Ответы (2)


1) Да, вы, безусловно, можете смешивать и сопоставлять, какие среды выполнения C++ использует ваш код C++, если эти отдельные модули фактически не передают объекты между собой. Например, если в вашем приложении есть два модуля, которые просто предоставляют C API, но внутри используют C++, то каждый из них может использовать любую среду выполнения C++, которую он хочет. Проблемы возникают при попытке совместного использования объектов между средами выполнения.

2) Вы можете использовать аргумент командной строки '--stdlib=libstdc++' или '--stdlib=libc++' при компиляции и компоновке, чтобы указать, какую библиотеку C++ использовать. Если ваш окончательный исполняемый файл должен быть связан с обоими, вам нужно вручную указать другой (например: --stdlib=libc++ -lstdc++).

3) Да, но обратите внимание, что libstdc++ устарела несколько лет назад и даже недоступна ни для watchOS, ни для tvOS, поэтому лучше всего просто перевести все на libc++.

person Jeremy Huddleston Sequoia    schedule 27.09.2015
comment
Спасибо. Это был ответ, который я искал. Знаете ли вы, существует ли аргумент командной строки для связывания библиотеки, а затем явно указать версию stl только для этой? - person csotiriou; 27.09.2015
comment
При компиляции одного исходного файла вы указываете, какую среду выполнения C++ вы используете, и компилятор будет использовать соответствующий STL для этой среды выполнения. Это использование --stdlib=libc++ или --stdlib=libstdc++ во время компиляции. Во время компоновки аргумент --stdlib=... просто сопоставляется с соответствующей компоновкой библиотеки; поэтому вам нужно вручную указать другой во время ссылки. - person Jeremy Huddleston Sequoia; 27.09.2015

Пока вы не смешиваете объекты (например, передаете строку из одной библиотеки в функцию, которая ожидает строку другого типа), вы можете сделать это, включив обе библиотеки при создании приложения верхнего уровня.

В моем случае это сработало, установив стандартную библиотеку C++ на версию GNU, а затем добавив libc++, как и любую другую системную библиотеку.

person Phillip Mills    schedule 26.09.2015