2016-06-06 6 views
1

У меня есть программа MinGW64 C++, и мне нужно, чтобы связать его против MSVC 64-битной библиотеки статического C поставляется в виде файл объект (OBJ)Предупреждения при компоновке программы MinGW с MSVC статическим Lib

Я преобразовал его .а с помощью:

ar rcs libtest.a test.obj 

Это создает статическую библиотеку без предупреждений

Когда я связать программу, я получаю:

Внимание: коррумпированный .drectve в конце Защиту файла

Но связанная программа, кажется, работает нормально (как долго?)

Как я могу избавиться от этого предупреждения? Библиотека не является открытым исходным кодом и поставляется коммерческим поставщиком. Я мог бы попросить его скомпилировать его с другими флагами, если потребуется.

ответ

0

я преобразовал его в .a с помощью:

ar rcs libtest.a test.obj 

На самом деле, это не преобразованияtest.obj каким-либо образом. Статическая библиотека (.a) - это просто архив объектных файлов плюс оглавление , с помощью которого линкер может его искать.

Ваша команда ar создает статическую библиотеку, содержащую только test.obj. Если вы знаете, что ваша связь с MinGW64 нуждается в test.obj, то нет точки , поместив ее в библиотеку в полном одиночестве. Линкер просто вытащит из библиотеки test.obj и добавит его в ссылку, чтобы вы могли также ссылку test.obj напрямую.

Если вы сделаете это, 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.