Как избежать "ошибки 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++ -> Генерация кода.

Случалось со мной несколько раз.

Обязательно "синхронизируйте" этот параметр даже для сборок выпуска и для каждой возможной комбинации (отладка, не отладка и т. Д.)

Другие вопросы по тегам