Создание DLL с другой средой C ++

У меня есть библиотека, которую я создаю, и она должна быть библиотекой DLL, которая связана с основным решением.

Эта новая DLL довольно сложна, и я хотел бы использовать возможности C ++ 11, в то время как программа, которая будет связывать ее, наверняка, не будет. Фактически, основная программа в настоящее время «чисто» построена с использованием VS2008 и VS2010 (и я думаю, что GCC 4.3 для Linux?).

Что я предлагаю:

Использование VS2012 в качестве IDE и Intel C ++ Compiler 2013 для компиляции в .dll / .so — для linux — что, как я понимаю, в основном связано с машинной формой (например, .exe).

Хотя я знаком с использованием C ++ для решения проблем, я не бегло разбираюсь в основах компиляции / компоновки и т. Д. Поэтому я хотел бы спросить сообщество, если

  1. Это возможно
  2. Если это возможно, насколько это легко (так просто, как я описал?) / Какие подводные камни или проблемы можно ожидать по пути (стоит ли это того)?

Области беспокойства, которые я ожидаю:

  • библиотеки времени выполнения — я ожидаю, что это будет фактором, который сорвет эти усилия. Я ничего не знаю о них / как они работают, кроме того, что они могут быть проблемой.
  • Различия в реализации стандартной библиотеки — должно ли это иметь значение, если это до формы DLL?
  • Конфликты потоков — потоки dll и потоки основных программ никогда не изменяют одни и те же данные, и фактически один из потоков основной программы вызывает функции DLL.

Бонус: несмотря на то, что вышеизложенный путь — мой путь, в идеале я бы хотел, чтобы этот код был открыт для intellisense, общего просмотра и т. Д. (По сути, чтобы он стал проектом в основном решении). Есть ли способ указать разные библиотеки времени выполнения / компилятор? Можно ли это сделать?

РЕДАКТИРОВАТЬ: Основная причина этой бонусной части состоит в том, чтобы устранить необходимые конфликты версий, которые возникнут, если основная программа и эта библиотека построены отдельно.

ПРИМЕЧАНИЕ: я не использую C ++ 11 только для того, чтобы быть более новым — строго типизированные перечисления и кросс-платформенный многопоточный код будут огромными бонусами для библиотеки.

1

Решение

Вопрос не столько в том, может ли приложение использовать библиотеку, созданную с помощью другого компилятора? (Ответ — да.) Но «Какие функции C ++ можно использовать в открытом интерфейсе библиотеки, созданной с помощью другого компилятора и стандартной библиотеки C ++?»

В Windows ответ «почти нет». Интерфейсы (классы, содержащие только виртуальные функции) об этом. Нет классов с членами данных. Без исключений. Нет объектов времени выполнения (таких как экземпляры iostream или строки). Нет шаблонов.

В Linux ответ «намного больше, но все же не так много». Классы в порядке, пока ODR удовлетворен. Исключения будут работать. Шаблоны тоже, пока определение одинаково с обеих сторон. Но определения стандартных типов библиотек изменились между C ++ 03 и C ++ 11, поэтому вы, например, не сможете передать std::string или же std::vector<int> объекты между приложением и библиотекой (обе стороны могут использовать эти функции, но один и тот же объект не может пересекаться).

2

Другие решения

Боюсь, что это невозможно с C ++. Особенно название Манглинг может быть разным. Все файлы C ++, связанные вместе, должны быть скомпилированы одним и тем же компилятором.

В C ++ extern "C" вещи являются стандартными (именование, соглашение о вызовах), поэтому библиотеки C могут вызываться из C ++, а также функции C ++, объявленные в extern "C" блок. Это исключает классы, шаблоны, перегрузки, смешивать их, скомпилированные разными компиляторами, невозможно.

Что жаль.

1