Как избежать "ошибки LNK2005:" (уже определенные функции stdlib) при компиляции libpng с Microsoft Visual Studio '08?
(Почему я пытаюсь это сделать: мне не повезло с использованием предварительно собранных двоичных файлов для libpng в Windows (несмотря на многие часы проб и ошибок), и поэтому сейчас я пытаюсь скомпилировать его самостоятельно. Я нашел этот полезный блог пост, касающийся этого, в комплекте с файлом проекта Microsoft Visual Studio 2008, но, к сожалению, до сих пор не удалось его использовать.)
Он успешно компилируется при ссылке на двоичный файл zlib, найденный здесь, но при попытке связать его с тестовым файлом я получаю следующее:
C: \ Documents and Settings \ Администратор \ Мои документы>cl "C:\Documents and Settin gs\ Администратор \ Мои документы \test.c" "C:\ Документы и настройки \ Администратор \M y Documents\libpng.lib" -I "C:\Documents and Settings\ Администратор \ Мои документы \include" 32-разрядная версия оптимизирующего компилятора C/C++ Microsoft (R) 15.00.30729.01 для 80x86 Авторское право (C) Microsoft Corporation. Все права защищены. test.c Инкрементальный компоновщик Microsoft (R), версия 9.00.30729.01 Авторское право (C) Microsoft Corporation. Все права защищены. /out:test.exe test.obj "C:\Documents and Settings\ Администратор \ Мои документы \libpng.lib" MSVCRTD.lib(MSVCR90D.dll): ошибка LNK2005: _abort уже определен в LIBCMT.lib( abort.obj) MSVCRTD.lib(MSVCR90D.dll): ошибка LNK2005: _fread уже определен в LIBCMT.lib( fread.obj) MSVCRTD.lib(MSVCR90D.dll): ошибка LNK2005: _malloc уже определен в LIBCMT.lib (Malloc.obj) MSVCRTD.lib(MSVCR90D.dll): ошибка LNK2005: _free уже определено в LIBCMT.lib(f ree.obj) MSVCRTD.lib(MSVCR90D.dll): ошибка LNK2005: ___iob_func уже определен в LIBCMT .lib(_file.obj) ССЫЛКА: предупреждение LNK4098: defaultlib 'MSVCRTD' конфликтует с использованием других библиотек; U se /NODEFAULTLIB: библиотека test.exe: фатальная ошибка LNK1169: найден один или несколько кратно определенных символов
Кто-нибудь может пролить свет на то, как исправить эти ошибки?
1 ответ
Проблема заключается в том, что в одном из двух проектов используется многопоточная DLL, а в другом - многопоточная (без DLL) в Свойствах проекта -> Свойства конфигурации -> C/C++ -> Генерация кода.
Случалось со мной несколько раз.
Обязательно "синхронизируйте" этот параметр даже для сборок выпуска и для каждой возможной комбинации (отладка, не отладка и т. Д.)