Как избежать "ошибки 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
Может ли кто-нибудь пролить свет на то, как исправить эти ошибки?
Ответы
Ответ 1
Проблема заключается в том, что один из двух проектов использует многопоточную DLL, а другой использует многопоточную (без DLL в ней) в свойствах проекта → Свойства конфигурации → C/С++ → Генерация кода.
Случилось несколько раз.
Обязательно "синхронизировать" эту настройку даже для версий релизов и для каждой возможной комбинации (отладка, отладка и т.д.)