2015-06-19 6 views
1

Мы используем стороннюю библиотеку в нашем проекте Visual Studio 2013 C++. Эта библиотека, я думаю, использует другую библиотеку STL, чем наша. Мы получаем некоторые ошибки ссылок. Ошибок времени компиляции не существует. Насколько я понимаю, STL - это, в первую очередь, шаблонный код, который не требует связывания. Похоже, есть некоторые части STL, которые требуют связывания с библиотекой STL. Удивление, если есть способ заставить STL быть полностью встроенным. С уважением.Может ли STL быть полностью встроенным?

+3

Можете ли вы уточнить, что вы подразумеваете под «STL»? Я не думаю, что это означает, что вы думаете, что это значит. Вы спрашиваете о всей стандартной библиотеке C++? Или, может быть, просто функциональность, заявленная в определенных стандартных заголовках? –

ответ

3

Нет ответа на этот вопрос. В общем, C++, как известно, не является «совместимым с каналом» (или «двоичной совместимостью») между различными версиями компиляторов (или разными брендами компиляторов и т. Д. И т. Д.). Поэтому кто-то, кто предоставляет библиотеку, ДОЛЖЕН точно указать, какой компилятор они ожидают использовать, и пользователю библиотеки нужно будет использовать ее. [Я даже видел проблемы с использованием одной и той же версии, но две разные «сборки» компилятора]

К ВОЗМОЖНОМ найти решение, вам нужно будет посмотреть, что именно пытается выполнить компилятор/компоновщик найти, а затем посмотреть, присутствует ли эта функция в источниках для STL - если это так, то, возможно, применение либерального разбрызгивания (по соответствующим функциям) «always_inline» или того, что этот конкретный компилятор использует для этой функции. Но есть вероятность, что функции, которые вам не хватает, не указаны в файлах заголовков в первую очередь. Это, конечно, предполагает, что у вас на самом деле есть источник для библиотеки, чтобы можно было перекомпилировать [или вы можете убедить провайдера перекомпилировать новые настройки].

И у вас потенциально все еще будут проблемы с вещами, зависящими от реализации (проблема с «той же версией, другой сборкой», о которой я упоминал выше, заключается в том, что кто-то, кто написал реализацию STL, решил изменить параметр конструктора из «unsigned int», на «size_t» в какой-то момент, который [может изменить или] изменяет размер данных, переданных конструктору, -> не ведет себя одинаково при вызове функции [но загрузчик разделяемой библиотеки обнаруживает его и отказывается даже загружать исполняемый файл/общая комбинация библиотека]

[Как легковесность Расы в Orbit говорит, вышесказанное относится к «стандартной библиотеки шаблонов», что такие вещи, как std::vector, std::map, std::random и многое другое Программа вещи, но это не включает в себя все функциональные возможности выполнения, которая требуется для записи любого нетривиального C++]

2

STL в первую очередь на основе шаблонов кода

«СТЛ» как термин (что само по себе является неточным) relates only to a very small subset of the C++ standard library, и множество стандартной библиотеки C++ не являются шаблонами. И это все еще не учитывает ни одну из исполняемых файлов C++, которые ваша реализация должна связать с вашим проектом.

Итак, предполагая, что вы имеете в виду либо стандартную библиотеку C++, либо (скорее всего) всю среду исполнения Visual Studio & hellip; нет, вы не можете встроить все.

Возможно, вам придется перестроить стороннюю библиотеку против вашей собственной инструментальной цепочки.