У vc \ lib присутні 4 версії бібліотек посилань CRT:
- libcmt.lib: статична бібліотека посилань CRT для складання випуску (/ MT)
- libcmtd.lib: статична бібліотека посилань CRT для складання налагодження (/ MTd)
- msvcrt.lib: бібліотека імпорту для випуску DLL-версії CRT (/ MD)
- msvcrtd.lib: бібліотека імпорту для налагодження DLL-версії CRT (/ MDd)
Подивіться на параметри сполучника, Project + Properties, Linker, Command Line. Зверніть увагу, як ці бібліотеки тут не згадуються. Лінкер автоматично визначає, який / M комутатор використовувався компілятором, а який .lib повинен бути пов'язаний через директиву про коментарі #pragma. Як би важливо, ви отримаєте жахливі помилки посилань і важко діагностувати помилки виконання, якщо не було б збіг між параметром / M та .lib, з яким ви посилаєтесь.
Ви побачите повідомлення про помилку, яке ви цитували, коли лінкеру буде сказано як посилання на msvcrt.lib та libcmt.lib. Що станеться, якщо ви зв’яжете код, який був складений з / MT, з кодом, який був пов'язаний з / MD. Існує лише одна версія CRT.
/ NODEFAULTLIB повідомляє лінкеру ігнорувати директиву коментарів #pragma, яка була сформована з компільованого коду / MT. Це може спрацювати, хоча низка інших помилок лінкера не рідкість. Такі речі, як errno , що є зовнішнім int у статичній CRT-версії, але макроед до функції у версії DLL. Багато інших подібне.
Ну, виправте цю проблему правильним шляхом, знайдіть файл .obj або .lib, який ви посилаєте, який був складений з неправильною опцією / M. Якщо у вас немає поняття, ви можете знайти його, перетягнувши файли .obj / .lib для "/ MT".
Btw: у виконуваних файлів Windows (наприклад, version.dll) є своя версія CRT, щоб виконати свою роботу. Він розташований у c: \ windows \ system32, ви не можете надійно використовувати його для власних програм, його CRT-заголовки недоступні ніде. CRL DLL, який використовується вашою програмою, має іншу назву (наприклад, msvcrt90.dll).