2010-05-17 3 views
0

Мой проект работает нормально, но его требование для некоторых 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 и LIBCMTconflicts 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

ответ

4

Ну, писать мой вопрос привел меня к решению.

Ключ был две линии:

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 

Я нашел «Ignore конкретную библиотеку» во входной части секции линкера свойств проекта. Добавляя LIBCMT там, и только тот, исправил все.

Почему? Без понятия. Что случилось с этим символом _main? Ударь меня. Но это работает.

0

На самом деле я нахожу много вещей в Mac, которые имеют больше смысла, я думаю, что Microsoft просто хочет быть другим;) VS - это хорошая среда IDE в целом с устройствами Debugger и Intellisense, которые я даже немного превосхожу XCode.

вход в основной вы можете установить в (Project Properties - Свойства> Конфигурация ->) Linker -> Дополнительно -> Точка входа встречает

Смежные вопросы