Как разрешить -z multidefs с g++47

Как я могу сказать компоновщик g++ разрешить несколько определений символов (выбрать первое появление)?

-z multidefs Позволяет несколько определений символов. По умолчанию несколько определений символов, встречающихся между перемещаемыми объектами (.o файлами), приводят к фатальной ошибке. Эта опция подавляет состояние ошибки и позволяет определить первое определение символа. Эта опция действительна, только если указана опция -b svr4.

-zmuldefs опция не распознается g++ни -z OPTION, Какой правильный параметр? Является ли это возможным?

2 ответа

Решение

Не существует такого понятия, как "линкер g++", он использует собственный линкер вашей системы.

Чтобы передать опции от GCC к компоновщику, вам нужно использовать GCC -Wl, или же -Xlinker опции:

-Xlinker option
Проходить option как вариант для компоновщика. Вы можете использовать это для предоставления системных опций компоновщика, которые GCC не знает, как распознать.
Если вы хотите передать опцию, которая принимает отдельный аргумент, вы должны использовать -Xlinker дважды, один раз для опции и один раз для аргумента. Например, чтобы передать -assert definitions, вы должны написать -Xlinker -assert -Xlinker definitions, Это не работает, чтобы написать -Xlinker "-assert definitions"потому что это передает всю строку как один аргумент, что не то, что ожидает компоновщик.
При использовании компоновщика GNU обычно более удобно передавать аргументы в параметры компоновщика с помощью option=value синтаксис, чем в качестве отдельных аргументов. Например, вы можете указать -Xlinker -Map=output.map скорее, чем -Xlinker -Map -Xlinker output.map, Другие компоновщики могут не поддерживать этот синтаксис для параметров командной строки.

-Wl,option
Проходить option как вариант для компоновщика. Если option содержит запятые, он разделен на несколько опций в запятых. Вы можете использовать этот синтаксис для передачи аргумента опции. Например, -Wl,-Map,output.map проходит -Map output.map компоновщику. При использовании компоновщика GNU, вы также можете получить тот же эффект с -Wl,-Map=output.map,

Так что вы хотели бы использовать

-Xlinker -z -Xlinker multidefs

или же

-Wl,-z,multidefs

но документы, которые вы цитировали, говорят, что вы также должны использовать -b svr4 использовать эту опцию, например,

-Wl,-b,svr4,-z,multidefs

Редактировать: из ваших комментариев я вижу, что вы находитесь в Mac OS X, которая использует компоновщик darwin, а на его странице руководства показано, что соответствующая опция устарела:

-m Не рассматривайте множественные определения как ошибку. Это больше не поддерживается. Эта опция устарела.

GCC использует ld в качестве линкера в Linux, который является частью binutils созданный GNU.

Похоже новая версия ld не поддерживает -z muldefs вариант. Вы можете попробовать использовать --allow-multiple-definition как альтернатива.

Другие вопросы по тегам