Как сделать статическую библиотеку Release / Debug независимой в VS2010 Express? - PullRequest
2 голосов
/ 26 февраля 2011

Я программирую приложение и связываюсь с SDL и OpenGL.В моем коде у меня есть следующие строки:

#pragma comment(lib, "sdl.lib")
#pragma comment(lib, "sdlmain.lib")
#pragma comment(lib, "opengl.lib")

Это работает только в режиме выпуска.В режиме отладки я получаю следующую ошибку компоновщика:

libcmt.lib(invarg.obj) : error LNK2005: __initp_misc_invarg already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: __call_reportfault already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) already defined in LIBCMTD.lib(invarg.obj)
libcmt.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler already defined in LIBCMTD.lib(invarg.obj)
libcpmtd.lib(xdebug.obj) : warning LNK4098: defaultlib 'libcmt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library

Я скомпилировал SDL из исходного кода для своего приложения, поэтому я могу контролировать флаги компилятора.

Когда я указываю / NODEFAULTLIB:«LIBCMT.LIB» или / NODEFAULTLIB: «LIBCMT» для проекта SDLMain, утилита dumpbin.exe по-прежнему сообщает следующее после компиляции для sdlmain.lib:

Linker Directives
-----------------
/DEFAULTLIB:"LIBCMT"
/DEFAULTLIB:"OLDNAMES"

Эти директивы компоновщика не появляются, когда яиспользуйте dumpbin против opengl.lib (который поставляется с VS2010 Express).Opengl.lib работает в режимах Release и Debug.Sdl.lib работает как в режиме выпуска, так и в режиме отладки, потому что, я думаю, это библиотека DLL, а не статическая библиотека.

Что я здесь не так делаю?

РЕДАКТИРОВАТЬ:

Мне удалось его скомпилировать и связать, добавив /NODEFAULTLIB:LIBCMT.LIB в мою собственную конфигурацию Debug вместо SDLMain.Я также предположил, что библиотека OpenGL была статической библиотекой, но это не так, это также библиотека DLL.

1 Ответ

6 голосов
/ 26 февраля 2011

В vs2005 в конфигурации проекта в настройках компоновщика я бы установил «игнорировать конкретную библиотеку» в libcmt.lib. Конфиг vs2010 может быть похожим. В любом случае, пожалуйста, попробуйте проигнорировать libcmt.lib и посмотрите, что произойдет.

- Пит

...