Как я могу сказать компоновщик g++
разрешить несколько определений символов (выбрать первое появление)?
-z multidefs Позволяет использовать несколько определений символов. По умолчанию несколько определений символов встречаются между перемещаемыми объектами (файлы .o)
приведет к фатальной ошибке. Эта опция подавляет
условие ошибки и позволяет получить первое определение символа.
Эта опция действительна, только если указана опция -b svr4.
-zmuldefs
опция не распознается g++
ни -z OPTION
, Какой правильный параметр? Является ли это возможным?
Не существует такого понятия, как «компоновщик 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
как альтернатива.