Если вы сделаете это, GNU-компоновщик MinGW64 свяжет его и выдаст точно то же предупреждение, которое вы получите, связав его со статической библиотекой. Это показывает, что то, что провоцирование предупреждения в файле объект, и именно это: -
Формат файла объект PE предоставляет раздел «abitrary информации», что компилятор условно- метки .drectve
и использует для встраивания директивы он хочет связаться с компоновщиком, , который будет читать и подчиняться им - если это возможно.
MSVC поэтому использует раздел .drectve
и, естественно, пишет там директивы компоновщика, которые делают смысл MS-линкера, например .
Microsoft (R) COFF/PE Dumper Version 12.00.31101.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file hw.obj
File Type: COFF OBJECT
Linker Directives
-----------------
/DEFAULTLIB:LIBCMT
/DEFAULTLIB:OLDNAMES
Summary
C .data
64 .debug$S
2F .drectve
12 .text$mn
Они не имеют никакого смысла для линкера GNU, поэтому он предупреждает, что раздел .drectve
поврежден.
Можете ли вы подавить предупреждение?
Нет, такого варианта нет.
Можете ли вы заставить продавца предотвратить предупреждение, составив test.obj
для вас по-другому?
В зависимости от того, что MSVC сгенерированного содержания «коррумпированной» .drectve
раздела (который можно обнаружить с dumpbin
), может быть вариантом компилятора MSVC для подавления своего поколения. Но об этом позже.
Безопасна ли связь?
Хорошо, что ваш линкер считает, что объектный файл поврежден, должен управлять ожиданиями. MinGW64 не обещает, что вы можете связать объектные файлы MSVC со своим собственным, безопасным или вообще. MSVC не обещает, что вы можете связать свои объектные файлы с любыми другими. Windows не регулирует статическую привязку объектных файлов разных компиляторов. На практике вы можете связать test.obj
с другим приложением GCC C++, потому что все объектные файлы представляют собой объектные файлы Windows COFF pe-x86-64, такие как ваш компоновщик, могут соединяться вместе с , и, к счастью, test.obj
содержит C, а не C++ , символы, поэтому несовместимое имя имени MS и GCC C++ не мешает ему. Если программа работает, то такая уверенность в сводится к безопасности, которую вы собираетесь получить.
Если вы действительно хотите получить больше уверенности - или просто хотите двоичный, сделанный из test.obj
, что можно связать с приложением без предупреждений - попробуйте сделать DLL из test.obj
:
g++ -shared -o test.dll test.obj
такое же предупреждение о связях следует ожидать, когда вы делаете этот одноразовый шаг, но если в противном случае успешно, то можно связать с вашим приложением, по крайней мере, с обеспечением совместимости ABI, , потому что это DLL.
Который возвращает нас к опции компиляции с разными параметрами. Если продавец выполнит компиляцию test.obj
в соответствии требованиям в соответствии требованиям, а затем потребует от коммитащика в качестве DLL. Для Windows, DLL - это стандартная единица совместимости ABI.