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

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

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

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

0

Решение

Не существует такого понятия, как «компоновщик 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 Не рассматривайте множественные определения как ошибку. Это больше не поддерживается. Эта опция устарела.

3

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

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

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

1

По вопросам рекламы [email protected]