Мой проект работает нормально, но его требование для некоторых DLL означает, что он не может быть просто перетащен конечным пользователем. DLL не загружаются вместе с моим исполняемым файлом, потому что мой исполняемый файл не является приложением, и его расположение не в тех немногих местах, где Windows ищет DLL. Я уже задавал вопрос о том, как сделать их загрузку. Ни одно из предложений не сработало (см. Вопрос на , как плагин Win32 App может загрузить свою DLL в свою собственную директорию )
Итак, я сейчас изучаю другой способ: полностью избавиться от библиотек DLL и связать их со статическими версиями. Это терпит неудачу для последней из тех DLL.
Итак, я нахожусь в этой точке, где все библиотеки, кроме одной, статически связаны, и все в порядке. Последняя библиотека - это стандартная библиотека C для mySQL, она же Connector / C. Проблема, с которой я столкнулся, может быть, а может и не быть связана с этим источником.
Всякий раз, когда я переключаюсь на статическую библиотеку в дополнительной зависимости компоновщика, я получаю следующие ошибки (журнал в конце):
1 - около 40 дублированных символов (например, _toupper
) между LIBCMT.lib и MSVCRT.lib. Интересно, что я не могу контролировать включение этих двух библиотек: они из Visual Studio и включаются автоматически. Так почему же эти символы дублируются, когда я включаю статическую библиотеку mySQL, а не ее DLL?
Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\MSVCRT.lib:
Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib:
Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\msvcprt.lib:
Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\LIBCMT.lib:
LIBCMT.lib(setlocal.obj) : error LNK2005: _setlocale already defined in MSVCRT.lib(MSVCR90.dll)
Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\MSVCRT.lib:
MSVCRT.lib(MSVCR90.dll) : error LNK2005: _toupper already defined in LIBCMT.lib(toupper.obj)
2 - два предупреждения, что MSVCRT
и LIBCMT
conflicts with use of other libs
, с предложением use /NODEFAULTLIB:library:
. Я не понимаю этого предложения: что мне делать и как?
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
3 - внешний символ не определен: _main
. Значит ли это, что статическая библиотека MySQL (но не DLL) ссылается на символ _main
? Ради этого я попытался определить пустую функцию с именем _main()
в своем коде, без разницы.
LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Как уже упоминалось в моем первом вопросе, мой код является портом полностью рабочей версии кода для Mac. Это плагин для хост-приложения, который я не контролирую. Порт в настоящее время работает, хотя и с проблемами установки из-за этой оставшейся DLL. Как программист Mac, я довольно дезориентирован с Visual Studio и Windows, которые я нахожу запутанными, плохо спроектированными и документированными, с сообщениями об ошибках, которые очень трудно понять и обработать. Поэтому я буду очень благодарен за любую помощь.
Вот полный набор ошибок:
1> Поиск C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ lib \ MSVCRT.lib:
1> Поиск в C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ lib \ OLDNAMES.lib:
1> Поиск в C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ lib \ msvcprt.lib:
1> Поиск в C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ lib \ LIBCMT.lib:
1> LIBCMT.lib (setlocal.obj): ошибка LNK2005: _setlocale уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (tidtable.obj): ошибка LNK2005: __encode_pointer уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (tidtable.obj): ошибка LNK2005: __encoded_null уже определено в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (tidtable.obj): ошибка LNK2005: __decode_pointer уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (tolower.obj): ошибка LNK2005: _tolower уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (invarg.obj): ошибка LNK2005: __set_invalid_parameter_handler уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (invarg.obj): ошибка LNK2005: __invalid_parameter_noinfo уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (crt0dat.obj): ошибка LNK2005: __amsg_exit уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (crt0dat.obj): ошибка LNK2005: __initterm_e уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (crt0dat.obj): ошибка LNK2005: _exit, уже определенный в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (crtheap.obj): ошибка LNK2005: __malloc_crt уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (dosmap.obj): ошибка LNK2005: __errno уже определено в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (_file.obj): ошибка LNK2005: ___iob_func уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (mlock.obj): ошибка LNK2005: __unlock уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (mlock.obj): ошибка LNK2005: __lock уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (winxfltr.obj): ошибка LNK2005: ___CppXcptFilter уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (crt0init.obj): ошибка LNK2005: ___xi_a уже определено в MSVCRT.lib (cinitexe.obj)
1> LIBCMT.lib (crt0init.obj): ошибка LNK2005: ___xi_z уже определен в MSVCRT.lib (cinitexe.obj)
1> LIBCMT.lib (crt0init.obj): ошибка LNK2005: ___xc_a уже определено в MSVCRT.lib (cinitexe.obj)
1> LIBCMT.lib (crt0init.obj): ошибка LNK2005: ___xc_z уже определен в MSVCRT.lib (cinitexe.obj)
1> LIBCMT.lib (hooks.obj): ошибка LNK2005: «void __cdecl terminate (void)» (? Terminate @@ YAXXZ) уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (winsig.obj): ошибка LNK2005: _signal уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (fflush.obj): ошибка LNK2005: _fflush уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (tzset.obj): ошибка LNK2005: __tzset уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (_ctype.obj): ошибка LNK2005: _isspace уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (_ctype.obj): ошибка LNK2005: _iscntrl уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (getenv.obj): ошибка LNK2005: _getenv уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (strnicmp.obj): ошибка LNK2005: __strnicmp уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (osfinfo.obj): ошибка LNK2005: __get_osfhandle уже определен в MSVCRT.lib (MSVCR90.dll)
1> LIBCMT.lib (osfinfo.obj): ошибка LNK2005: __open_osfhandle уже определен в MSVCRT.lib (MSVCR90.dll)
[...]
1> Поиск в C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ lib \ MSVCRT.lib:
1> MSVCRT.lib (MSVCR90.dll): ошибка LNK2005: _toupper уже определен в LIBCMT.lib (toupper.obj)
1> MSVCRT.lib (MSVCR90.dll): ошибка LNK2005: _isalpha уже определена в LIBCMT.lib (_ctype.obj)
1> MSVCRT.lib (MSVCR90.dll): ошибка LNK2005: _wcschr уже определен в LIBCMT.lib (wcschr.obj)
1> MSVCRT.lib (MSVCR90.dll): ошибка LNK2005: _isdigit уже определен в LIBCMT.lib (_ctype.obj)
1> MSVCRT.lib (MSVCR90.dll): ошибка LNK2005: _islower уже определен в LIBCMT.lib (_ctype.obj)
1> MSVCRT.lib (MSVCR90.dll): ошибка LNK2005: ___дозерно уже определено в LIBCMT.lib (dosmap.obj)
1> MSVCRT.lib (MSVCR90.dll): ошибка LNK2005: _strftime уже определено в LIBCMT.lib (strftime.obj)
1> MSVCRT.lib (MSVCR90.dll): ошибка LNK2005: _isupper уже определен в LIBCMT.lib (_ctype.obj)
[...]
1> Закончен поиск библиотек
1> Создание библиотеки z: \ PCdev \ Test \ RK_Demo_2004 \ plugins \ Test.bundle \ contents \ windows \ Test.lib и объекта z: \ PCdev \ Test \ RK_Demo_2004 \ plugins \ Test.bundle \ contents \ windows \ Test.exp
1> Поиск библиотек
[...]
1> Закончен поиск библиотек
1> ССЫЛКА: предупреждение LNK4098: defaultlib 'MSVCRT' конфликтует с использованием других библиотек; использовать / NODEFAULTLIB: библиотека
1> LINK: предупреждение LNK4098: defaultlib 'LIBCMT' конфликтует с использованием других библиотек; использовать / NODEFAULTLIB: библиотека
1> LIBCMT.lib (crt0.obj): ошибка LNK2001: неразрешенный внешний символ _main