У меня есть библиотека, которую я создаю, и она должна быть библиотекой DLL, которая связана с основным решением.
Эта новая DLL довольно сложна, и я хотел бы использовать возможности C ++ 11, в то время как программа, которая будет связывать ее, наверняка, не будет. Фактически, основная программа в настоящее время «чисто» построена с использованием VS2008 и VS2010 (и я думаю, что GCC 4.3 для Linux?).
Что я предлагаю:
Использование VS2012 в качестве IDE и Intel C ++ Compiler 2013 для компиляции в .dll / .so — для linux — что, как я понимаю, в основном связано с машинной формой (например, .exe).
Хотя я знаком с использованием C ++ для решения проблем, я не бегло разбираюсь в основах компиляции / компоновки и т. Д. Поэтому я хотел бы спросить сообщество, если
Области беспокойства, которые я ожидаю:
Бонус: несмотря на то, что вышеизложенный путь — мой путь, в идеале я бы хотел, чтобы этот код был открыт для intellisense, общего просмотра и т. Д. (По сути, чтобы он стал проектом в основном решении). Есть ли способ указать разные библиотеки времени выполнения / компилятор? Можно ли это сделать?
РЕДАКТИРОВАТЬ: Основная причина этой бонусной части состоит в том, чтобы устранить необходимые конфликты версий, которые возникнут, если основная программа и эта библиотека построены отдельно.
ПРИМЕЧАНИЕ: я не использую C ++ 11 только для того, чтобы быть более новым — строго типизированные перечисления и кросс-платформенный многопоточный код будут огромными бонусами для библиотеки.
Вопрос не столько в том, может ли приложение использовать библиотеку, созданную с помощью другого компилятора? (Ответ — да.) Но «Какие функции C ++ можно использовать в открытом интерфейсе библиотеки, созданной с помощью другого компилятора и стандартной библиотеки C ++?»
В Windows ответ «почти нет». Интерфейсы (классы, содержащие только виртуальные функции) об этом. Нет классов с членами данных. Без исключений. Нет объектов времени выполнения (таких как экземпляры iostream или строки). Нет шаблонов.
В Linux ответ «намного больше, но все же не так много». Классы в порядке, пока ODR удовлетворен. Исключения будут работать. Шаблоны тоже, пока определение одинаково с обеих сторон. Но определения стандартных типов библиотек изменились между C ++ 03 и C ++ 11, поэтому вы, например, не сможете передать std::string
или же std::vector<int>
объекты между приложением и библиотекой (обе стороны могут использовать эти функции, но один и тот же объект не может пересекаться).
Боюсь, что это невозможно с C ++. Особенно название Манглинг может быть разным. Все файлы C ++, связанные вместе, должны быть скомпилированы одним и тем же компилятором.
В C ++ extern "C"
вещи являются стандартными (именование, соглашение о вызовах), поэтому библиотеки C могут вызываться из C ++, а также функции C ++, объявленные в extern "C"
блок. Это исключает классы, шаблоны, перегрузки, смешивать их, скомпилированные разными компиляторами, невозможно.
Что жаль.