2016-08-31 5 views
2

Я компилирую свою программу, используя VS2005. Я связываюсь с статическими библиотеками SDL и получаю следующие ошибки компоновщика;ошибка компоновщика C++ LNK2005, уже определенная в SDL

1>LIBCMTD.lib(fpinit.obj) : error LNK2005: __fltused already defined in SDL2d.lib(SDL_stdlib.obj) 
1>LIBCMTD.lib(ftol2.obj) : error LNK2005: __ftol2_sse already defined in SDL2d.lib(SDL_stdlib.obj) 
1> Creating library ..\..\..\product\VS2005\libs\\Standalone.lib and object ..\..\..\product\VS2005\libs\\Standalone.exp 
1>..\..\..\product\VS2005\libs\\Standalone.exe : fatal error LNK1169: one or more multiply defined symbols found 

Я скомпилировал SDL2d.lib с использованием того же VS2005-компилятора. Моя первоначальная мысль заключалась в том, что у меня были несоответствующие настройки библиотеки времени выполнения для этих проектов. Однако после проверки они оба настроены на Multi-Threaded Debug.

Я только что заметил, что выход компоновщика выше, кажется, создает Standalone.lib и Standalone.exp перед созданием Standalone.exe. Я понятия не имею, почему это делает .lib и .exp

Любые другие причины возникновения этой ошибки?

Благодаря

+1

Это означает, что вы используете более одного времени выполнения. Кажется, вы смешиваете Debug и Release в одном приложении. 'LIBCMTD.lib' является частью отладочной CRT. 'LIBCMT.lib' является частью выпуска CRT. Если вы создаете приложение Debug, не забудьте использовать Release libs и viseversa. – drescherjm

+0

* «Однако после проверки они оба настроены на многопоточную отладку». * Это не может быть правильно. И если это так, вы связываетесь с другой библиотекой, о которой вы не упомянули в вопросе. Ошибки компоновщика очень четко указывают на то, что конфликтующая библиотека - это 'LIBCMT', которая является версией выпуска. –

+0

Спасибо, к сожалению, моя цитата была неправильной. Ive отредактировал вопрос и заменил LIBCMT.lib на LIBCMTD.lib. В выводе компоновщика не упоминается LIBCMT.lib, как-то пропало во время моей копии и вставки. Мои извинения, вопрос отредактирован – codetemplar

ответ

5

, необходимые для определения HAVE_LIBC в проекте SDL. Это остановило множественное переопределение как _ftlused, так и _ftol2_sse

+0

Он определен по умолчанию в заголовках SDL. Это не должно быть необходимо, если вы ранее не редактировали их, чтобы удалить определение. –

+0

'SDL_config_winrt.h' определяет' HAVE_LIBC' ... но интересно, сколько людей это использует? ;) SDL 2.04 и SDL 2.05, по какой-либо причине, по-видимому, не устанавливают его. Но при использовании cmake вы можете указать '-DLIBC = ON' в командной строке cmake для создания файла SDL_config.h, в котором' #define HAVE_LIBC 1'. Это было проблемой только для сборки x86 для меня. –