Как избежать ошибки LNK2005: (уже определенные функции stdlib) при компиляции libpng с помощью Microsoft Visual Studio '08?

(Почему я пытаюсь это сделать: мне не удалось использовать предварительно созданные двоичные файлы для libpng в Windows (несмотря на многие часы проб и ошибок), и поэтому сейчас я пытаюсь скомпилировать его сам. Я нашел это полезное сообщение в блоге, посвященное этому, вместе с файл проекта Microsoft Visual Studio 2008, но, к сожалению, до сих пор не удалось его использовать.)

Он успешно компилируется при связывании с найденным двоичным файлом zlib здесь, но при попытке связать его с тестовым файлом я получаю следующее:

    C:\Documents and Settings\Administrator\My Documents>cl "C:\Documents and Settin
    gs\Administrator\My Documents\test.c" "C:\Documents and Settings\Administrator\M
    y Documents\libpng.lib" -I "C:\Documents and Settings\Administrator\My Documents\include"

    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
    Copyright (C) Microsoft Corporation.  All rights reserved.

    test.c
    Microsoft (R) Incremental Linker Version 9.00.30729.01
    Copyright (C) Microsoft Corporation.  All rights reserved.

    /out:test.exe
    test.obj
    "C:\Documents and Settings\Administrator\My Documents\libpng.lib"
    MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: _abort already defined in LIBCMT.lib(
    abort.obj)
    MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: _fread already defined in LIBCMT.lib(
    fread.obj)
    MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: _malloc already defined in LIBCMT.lib
    (malloc.obj)
    MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: _free already defined in LIBCMT.lib(f
    ree.obj)
    MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: ___iob_func already defined in LIBCMT
    .lib(_file.obj)
    LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; u
    se /NODEFAULTLIB:library
    test.exe : fatal error LNK1169: one or more multiply defined symbols found

Может ли кто-нибудь пролить свет на то, как исправить эти ошибки?


person Sam    schedule 21.12.2009    source источник


Ответы (1)


Проблема в том, что в одном из двух проектов используется Многопоточная DLL, а в другом - Многопоточная (без DLL) в свойствах проекта -> Свойства конфигурации. -> C / C ++ -> Генерация кода.

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

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

person Thomas Bonini    schedule 21.12.2009
comment
Это ... было совершенно потрясающе. Также, Сэм. - person tjklemz; 13.03.2013
comment
Где этот параметр отображается в файлах, которые можно использовать с помощью grep? Я ничего не могу найти в файлах vcxproj, но, возможно, я ищу неправильный термин. - person jxramos; 20.10.2015
comment
На самом деле, только что заметил это сегодня в различии vcxproj, я по ошибке искал флаг компилятора / MDd вместо соответствующего описательного текста настройки. Отображается как: <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> - person jxramos; 22.10.2015