Страницы

Поиск по вопросам

пятница, 5 июля 2019 г.

Как использовать LIB от другого компилятора?

Имеется LIB, собранная в BC3.1, она использует его RTL. Собственно, вопрос заключается в том, как воспользоваться этой библиотекой в другом компиляторе? Исходников библиотеки, понятное дело, нет. Есть ли способ собрать "добавку" в BC3.1 к этой библиотеке, которую потом спокойно использовать в другом компиляторе?


Ответ

Вам необходимо будет сделать библиотеку-прослойку. Поскольку исходная lib использует RTL, взаимодействовать с нею нужно только компилятором версии, в которой она была собрана. Соответственно, при помощи этого компилятора необходимо собрать новую библиотеку, которая будет клиентом к исходной, предоставлять интерфейс к функциональности исходной, и этот интерфейс должен удовлетворять ряду "переносимых" критериев: "Ansi C" интерфейс. Т.е. никаких экспорта классов, никакого экспорта STL и т.п.. Экспорт только функций, входные и выходные параметры только стандартные типы. Никаких include-ов стандартных библиотек. Если Вы сделаете один header, в идеале ему вообще не нужно содержать сторонних include-ов. Если содержит, в идеале это "Ansi C", как, например, "windows.h" (могу ошибаться, но, вроде бы, он без включений STL, классов и т.п.) Библиотека не будет бросать никакие exception. Все их от исходной необходимо обрабатывать, но не пробрасывать выше. Перехвать exception компиляторозависим. Вся память, выделяемая внутри библиотеки, должна освобождаться внутри библиотеки. Если где-то управление жизнью выделенной памяти передается клиенту, то интерфейсу надо иметь функцию, которая будет позволять освобождать такую память. Лучше отказаться от абстрактных структур. Теоретически это не должно быть проблемой, но многие детали реализации виртуализации не стандартизированы, а значит компиляторы могут выполнять их по-разному, и это на практике (у меня между MinGW и VS разных версий, хотя между разными компиляторами MinGW и между разными VS такой проблемы не наблюдал) приводит к проблемам. Вроде бы ничего не забыл.

Комментариев нет:

Отправить комментарий