Как я могу узнать, какая библиотека включает в себя libcmt?
Я пытаюсь связать исполняемый файл Windows, который зависит от нескольких статических библиотек (некоторые из которых я собрал, а некоторые нет). Когда я делаю ссылку, я получаю множество ошибок, таких как:
LIBCMT.lib(mlock.obj) : error LNK2005: _unlock already defined in MSVCRT.lib(MSVCR100.dll)
которая является классической проблемой /MD против /MT (независимо от того, является ли среда выполнения C статически или динамически связанной). Сначала я попробовал простое решение, добавив флаги компоновщика.
/nodefaultlib:libcmt /nodefaultlib:libcpmt
но это только дало разные ошибки:
msvcprt.lib(MSVCP100.dll) : error LNK2005: "public: __cdecl std::_Locinfo::~_Locinfo(void)" (??1_Locinfo@std@@QEAA@XZ) already defined in gtest.lib(gtest-all.cc.obj)
gtest.lib(gtest-all.cc.obj) : error LNK2001: unresolved external symbol "private: static int std::locale::id::_Id_cnt" (?_Id_cnt@id@locale@std@@0HA)
Я просмотрел библиотеки, которые я строю, и, насколько я могу судить, я собираю их все /MD. Я говорю "насколько я могу судить", потому что некоторые из них являются сторонними библиотеками, которые поставляются со своими собственными make-файлами, поэтому у меня нет полного контроля над процессом сборки.
Я не думаю, что "зависит" работает от библиотек (только EXE и DLL), есть ли инструмент, который позволил бы мне взглянуть на различные библиотеки, на которые я ссылаюсь, и посмотреть, какая из них приносит libcmt, когда я хочу быть вместо этого использовать msvcrt?
1 ответ
У меня была та же проблема, и я использовал dumpbin ( http://msdn.microsoft.com/en-us/library/z66yd3h6.aspx) с параметрами /DIRECTIVES на библиотеках. Он покажет несколько разделов /DEFAULTLIB, каждый из которых представляет собой другую библиотеку, которую пытается использовать ваша библиотека. Дампбин должен запускаться из командной строки Visual Studio.
dumpbin /DIRECTIVES liblua52.lib
У меня было более 100 библиотек со всеми конфигурациями и платформами решения, поэтому я сделал скрипт на python 2.7 (crtdisplay.py), чтобы сделать это для меня. Его можно найти в моем репозитории bitbucket по адресу https://bitbucket.org/vimarina/ctrlcv/src/57b7ddca15b5c7fefddcf20ffcea0633223a4bd6/crtdisplay. Поместите его в корневой каталог ваших библиотек. Не так много ошибок в этом коде, поэтому не удивляйтесь, если он потерпит неудачу:). Я использовал Visual Studio 2010, поэтому может произойти сбой в других версиях Visual Studio.
crtdisplay.py > info.txt