2015-12-27 1 views
0

Я пытающийся связать свою программу с статическими библиотеками MFC, как показано в следующем целевом коде в моем Makefile (остальные пропущено):Как связать со статическими библиотеками MFC с помощью инструмента Microsoft Linker

!include <win32.mak> 

all: window.exe 

.cpp.obj: 
    $(cc) $(cdebug) $(cflags) $(cvars) $*.cpp 

window.exe: window.obj 
    $(link) $(ldebug) $(guiflags) -out:window.exe window.obj mfc100d.lib mfcs100d.lib $(winlibs) 

к сожалению, nmake останавливает процесс связывания и отображает следующие ошибки:

  • nafxcwd.lib (afxmem.obj): ошибка LNK2005: "аннулируется оператор __cdecl удалить (пустой *)" (?? 3 @ YAXPAX @Z), уже определенный в mfc100d.lib (mfc100d.dll)

  • ССЫЛКА: предупреждение LNK4098: defaultlib 'nafxcwd.lib' конфликтует с использованием других libs; использование/NODEFAULTLIB: библиотека

  • mfcs100d.lib (appmodul.obj): предупреждение LNK4217: (? AfxInitialize @@ YGHHK @ Z) локально определенный символ __setmbcp импортирован в функции "ИНТ __stdcall AfxInitialize (целое число без знака в длину)"

  • window.exe: фатальная ошибка LNK1169: один или несколько умножить определенные символы найдены

Кроме говорить инструмент Microsoft Linking игнорировать nafxcwd.lib, мне нужно указать любые дополнительные имена библиотек или определений препроцессора ?

ответ

1

Прежде всего: не используйте опцию NODEFAULTLIB. Это не предназначено для вас на этом этапе. Это важно. Вместо этого вам нужно настроить другие параметры.

Способ, которым MFC связан с вами, должен быть таким же, как и CRT. Соединение MFC устанавливается в свойствах вашего проекта> Свойства конфигурации> Общие>Использование MFC. Существует два варианта для статической и динамической компоновки.

Ссылка на CRT (и компиляция) задана в свойствах проекта> Свойства конфигурации> C/C++> Генерация кода>Библиотека времени выполнения. Должно быть 4 варианта. Те, у кого нет DLL в названии, указаны для static. Те, у кого есть DLL, принадлежат динамическим. Те, у которых есть Debug в названии, предназначены для конфигураций Debug.

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

В проекте nmake, если вы хотите установить ссылку на статический MFC, тогда не связывайте mfc100d.lib и mfcs100d.lib библиотеки в ваш проект, потому что эти библиотеки предназначены для динамической компоновки. Ссылка на nafxcwd.lib для Debug (которую вы уже связываете, в противном случае не было бы никакой ошибки), или nafxcw.lib для выпуска. Кроме того, необходимо определить макрос _AFX, и должен быть вариант /MT для выпуска, или /MTd для сборки Debug.

Если вы хотите связать MFC динамически, укажите макрос _AFXDLL и добавьте опцию /MD (для выпуска) или/MDd (для сборки Debug). Для получения дополнительной информации см. Раздел «Создание с NMAKE» в технической ноте Microsoft TN033.

Одна из проблем может заключаться в том, что у вас есть сторонняя библиотека, которая уже установлена ​​определенным образом, и вы должны следовать этому пути в своих настройках. Другая проблема заключается в том, что у вас есть две такие библиотеки, но они установлены по-разному. Тогда невозможно связать их вместе. Если это касается вас, я разберу ответ.

+0

У меня установлен Windows SDK и Visual Studio 2010, но мой код не входит в проект. Есть ли способ скомпилировать мой код с поддержкой MFC в командной строке? – benardier

+0

@edition извините, полностью пропустил это было сделано в nmake. Отредактировал ответ. – Dialecticus

Смежные вопросы