Segfault на библиотеке плагина C++ с дублирующимися символами

Просто расширив это немного от исходного вопроса, существуют некоторые из нас выполнение техническая разработка Windows Дельфи на виртуальных машинах, также.

у меня есть MacBook Pro (1-й генерал) с несколькими концертами поршня и недавней iMac (с 4 концертами поршня). У меня было больше удачи, чем xanadont с внешними дисками, выполняя несколько различных брендов на Firewire 400 и находя, что они соглашаются с 16-20Gb VMs. Если я собираюсь быть в одном месте в течение нескольких дней (или в офисе на iMac, или на дороге с MBP) тогда я скопирую VM в локальный диск, но как правило это хорошо работало в течение приблизительно 2 лет теперь.

я запустил с Параллелей, но там приехал точка, когда они начали выпускать версии, которые не были регрессией, протестированный, и иногда основной материал будет внезапно поврежден в текущем выпуске. Простая фиксация, прекратите загружать новую версию и останьтесь 3-6 месяцев позади всех остальных. Тогда я должен был дать VM коллеге и должен был пройти несколько обручей, вытаскивающих его из Параллелей и в VMware. В той точке я попробовал бету Fusion, имел собственный опыт перемещения VM между Mac и Windows (без реальной суеты вообще), и это убедило меня переключиться на Fusion. Я должен сказать, Fusion является превосходным, стабильным, надежным инструментом.

я выполняю WInXP Pro SP 3, Дельфи 7, Дельфи 2007, SQL Express и различные средства разработки на моем VMs (я склонен иметь VM для каждого из моих клиентов).

И я соглашаюсь с xanadont о вещи поршня на 1 ГБ - мои имеют тенденцию иметь концерт и более - я не видел реального изменения в поведении/производительности с> 1 ГБ в vm, таким образом, это более обеспечено данный хостовой операционной системе, а не виртуальной.

7
задан CuppM 3 December 2009 в 19:53
поделиться

3 ответа

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

. быть несколькими хулителями с предупреждениями о -Bsymbolic :
http://www.technovelty.org/code/c/bsymbolic.html
http://software.intel.com/ en-us / articles / performance-tools-for-software-developers-bsymbolic-can-cause-dangerous-side-effects /

Но, учитывая их предупреждения и намерение плагина, я думаю, что это правильный вариант для меня. По крайней мере, пока.

4
ответ дан 7 December 2019 в 12:21
поделиться

Я согласен с Гленом - вы не решите эту проблему, если не измените имена классов, возможно, через пространства имен. На изменение даже 36 файлов, вероятно, потребуется меньше времени, чем на попытку надежного исправления без изменения имен символов.

Начните с определения всех классов, имена которых необходимо изменить. Ваш компоновщик, вероятно, уже перечисляет их для вас. Затем я бы изменил имена обоих наборов классов (например, с Foo на Engine :: Foo и Plugin :: Foo) по крайней мере временно. Таким образом вы можете заставить компилятор найти все ссылки на проблемные классы. Продолжайте работать с источником плагина, пока плагин не скомпилируется со ссылками на правильные имена новых классов плагина. Как только это будет сделано, измените Engine :: classes обратно на их старые имена (если вы также не хотите постоянно изменять исходный код движка, что, похоже, вы не делаете). Теперь плагин должен скомпилироваться и связать с правильными классами с уникальными именами.

1
ответ дан 7 December 2019 в 12:21
поделиться

Я бы просто обернул ВЕСЬ код плагина пространством имен PluginX. Это обязательно избавит вас от этих ошибок. В любом случае, это очень хорошая и важная практика.

0
ответ дан 7 December 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: