Как разрешить -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
как альтернатива.