Я пишу приложение, которое связывает весь сторонний код через статические библиотеки (включая tinyxml2, sqlite3, openssl и libpq); все работает отлично, за исключением случаев, когда я пытаюсь связаться с libpqd.lib — используя источники 9.1.9 и 9.2.4 — я получаю:
1>LIBCMTD.lib(dosmap.obj) : error LNK2005: __dosmaperr already defined in libpqd.lib(win32error.obj)
Это единственная ошибка, и мои поиски до сих пор были бесплодными. Обратите внимание, что я использую многопоточную библиотеку времени отладки /MTd
во всех библиотеках, которые postgresql не имеет по умолчанию; Я вручную исправил win32.mak, чтобы использовать /MTd
а также /MT
на месте ранее неконфигурируемого /MDd
а также /MD
, Это решило некоторые предыдущие ошибки компоновщика, но не думаю, что это связано с этим последним, как это было ранее.
Я компилирую libpq через:
nmake /f win32.mak DEBUG=1
и ссылку на него по:
#pragma comment ( lib, "libpqd.lib" )
Каталог библиотеки настраивается в проекте, и библиотека копируется в эту папку, поэтому я знаю, что она используется правильно.
Обычно это легко решаемая ошибка, но я не уверен, где ее искать!
На сайте postgresql существует ветка об этом, но, похоже, она не решена: http://www.postgresql.org/message-id/39E6FC4547C24F9884435E23698B11DC@HIRO57887DE653
После проблем с ним даже при конвертации проекта в / MDd я решил заглянуть в исходный код.
<your_path>\postgresql-9.2.4\src\port\win32error.c
-> закомментируйте, или #if 0
функция _dosmaperr
,
Библиотеки генерируются, и приложение работает нормально.
Делать grep -R _dosmaperr ./
раскрыл только этот метод; но include/port/win32.h
а также include/pg_config_os.h
у обоих было это как extern.
Уже немного поздно для моего ума, чтобы сделать правильную голову / хвост, так что пока достаточно хорошо!
Других решений пока нет …