Мой проект работает нормально, но его требование для некоторых DLL означает, что его нельзя просто перетаскивать и удалять конечным пользователем. DLL не загружаются, когда вы ставите бок о бок с моим исполняемым файлом, потому что мой исполняемый файл не является приложением, а его местоположение не находится в нескольких местах, где Windows ищет DLL. Я уже задал вопрос о том, как сделать свою загрузку. Ни одно из предложений не работало (см. Вопрос на how can a Win32 App plugin load its DLL in its own directory)Как связать статическую библиотеку mySQL C с Visual Studio 2008?
Итак, теперь я изучаю другой способ: полностью избавьтесь от 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 lib (но не 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.1 ib (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): err или 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.dl л)
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: _сигнал, уже определенный в 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: ___doserrno уже определена в 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> Создание библиотеки г: \ PCdev \ Test \ RK_Demo_2004 \ Plugins \ Test.bundle \ содержимое \ Windo WS \ Test.lib и объект г: \ PCdev \ Test \ RK_Demo_2004 \ Plugins \ Test.bundle \ содержимое \ Windows \ Test.exp
1> Поиск библиотеки
[...]
1> Готовые поисковые библиотеки
1> LINK: предупреждение LNK4098: defaultlib 'MSVCRT' конфликтует с использованием других libs; use/NODEFAULTLIB: библиотека
1> LINK: предупреждение LNK4098: defaultlib 'LIBCMT' конфликтует с использованием других libs; использование/NODEFAULTLIB: библиотека
1> библиотека libcmt.lib (crt0.obj): ошибка LNK2001: неразрешенный внешний символ _main