Можно ли использовать скомпилированную библиотеку gcc с MSVC? - PullRequest
4 голосов
/ 24 ноября 2010

У меня есть проект, который использует libiconv для нескольких операций.

Я использовал предварительно скомпилированные двоичные файлы для iconv.lib для Visual Studio 2008, но теперь мне пришлось перейти на Visual Studio 2010 и не болеебыли доступны скомпилированные двоичные файлы.

Я решил скомпилировать его самостоятельно, но, как указано в документации libiconv, официальная поддержка компиляторов MSVC отсутствует.Однако я где-то читал, что gcc может генерировать статические библиотеки, которые были двоично совместимы с компиляторами MSVC, пока двоичный интерфейс остается в C.Хотя это звучало безумно, я попробовал, и это почти сработало.

Я скомпилировал его, переименовал в libiconv.a в iconv.lib и попытался с ним связаться.(Если это плохая идея, пожалуйста, дайте мне знать).

Сначала я столкнулся с ошибкой ссылки:

1>iconv.lib(iconv.o) : error LNK2001: unresolved external symbol ___chkstk

После некоторых исследований я перекомпилировал libiconv (как в x86, так и в x86).версия x64), добавив флаг -static-libgcc.

Это сработало, но только для выпуска моей программы для x64.Релиз x86 всегда дает сбой с одной и той же ошибкой.

Что я должен сделать, чтобы эта работа работала?

1 Ответ

3 голосов
/ 24 ноября 2010

Да, это возможно, потому что если вы компилируете строго как интерфейс C, iconv будет ссылаться на msvcrt.lib, который является средой выполнения Windows C (строго C, аналогично glibc, используемому GCC).Если вы построите его с помощью обычного компилятора C ++ GCC, он будет ссылаться на libstdc++, а также будет по-другому именовать mangle по сравнению с VC ++, который ссылается на msvcr.dll.

В вашем случае __chkstkфункция проверки стека (часть времени выполнения C), функция, внедряемая в каждый вызов функции для проверки переполнения стека.Я не уверен, как решить этот «хороший» способ, но вы можете изменить параметры сборки для iconv для сборки с помощью дополнительного флага компилятора и отменить эту проверку: /Gs999999


Тем не менее, я создал libiconv с Visual C ++ 2005/2008/2010, и программное обеспечение, построенное на его основе, отлично работало (программное обеспечение, используемое военными учреждениями, если вам нужно доверие).Я помню, что это немного раздражает, когда я собираюсь использовать компилятор VC ++, но это не должно быть слишком мучительным.

...