Я хочу создать файл DLL из моего исходного кода, но у меня была ошибка. Во время связывания командная строка не могла разрешить так много объектов и отказалась от связывания.
Я решил разделить объекты на две библиотеки и затем создать DLL из двух библиотек.
Я запускаю свой make-файл, но связь прерывается с новой ошибкой: unresolved external symbol _DllMainCRTStartup@12
Я использую следующие настройки:
/Od /MT /EHsc /MP /Zi /Zl /Zp8 /c /DSOMEDEFINE
/MAPINFO:EXPORTS /SUBSYSTEM:WINDOWS /MACHINE:X86 /MANIFEST /INCREMENTAL:NO /NOLOGO /DLL /DEBUG /OUT:"$(__NAME).dll" /LIBPATH:$(__MS_LIB_PATH) \
/LIBPATH:"$(SW_HOME)\lib" /LIBPATH:"$(SW_HOME)\common\lib" /PDB:"$(__NAME).pdb" /MAP:"$(__NAME).map"
Мой процесс сборки проходит в три этапа:
первый шаг: скомпилировать все объекты
второй шаг: используйте lib.exe для создания двух файлов с расширением * .LIB
третий шаг: используйте link.exe для создания DLL-файла из LIB-файлов.
но у меня есть ошибка связи, как в моем названии.
Итак, я полагаю, что проблема возникает из-за того, что некоторые пути к папке Visual Studio во время компоновки некорректны или при разделении объектов в двух библиотеках что-то идет не так и некоторая информация исчезает.
Или я использую не правильные параметры для компилятора и компоновщика.
Может ли кто-нибудь помочь мне решить это?
Это не прямой ответ на ваш вопрос, а объяснение на простом английском языке того, в чем может быть проблема.
Если вы вызываете функцию, вы должны сначала предоставить объявление для нее. Компилятор проверит ваш вызов на предмет объявления. Если функция является библиотечной функцией, компилятор будет искать ее в одном из файлов интерфейса библиотеки (GetTickCount
декларация находится в WinBase.h
, например). Если вы не включите файл, в котором находится объявление, компилятор выдаст ошибку (GetTickCount not found
).
Если вызываемая вами функция является библиотечной, вам нужно будет предоставить библиотеку, в которой эта функция реализована (GetTickCount
находится в kernel32.lib
). Если компоновщик не найдет функцию в предоставленных библиотеках, он выдаст ошибку (unresolved external symbol GetTickCount
).
Вы на самом деле не указываете никаких библиотек в ваших опциях, просто некоторые дополнительные пути к библиотекам (/LIBPATH
). Поэтому компоновщик не находит реализацию функций, которые вы вызываете: «Во время связывания командная строка не могла разрешить так много объектов и отказалась от связывания». Вот как выглядят автоматически сгенерированные параметры (обратите внимание на различия):
/OUT:"m:\temp\Win32Project1\Release\Win32Project1.dll" /MANIFEST /LTCG:incremental /NXCOMPAT /PDB:"m:\temp\Win32Project1\Release\Win32Project1.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /IMPLIB:"m:\temp\Win32Project1\Release\Win32Project1.lib" /DEBUG /DLL /MACHINE:X86 /OPT:REF /SAFESEH /INCREMENTAL:NO /PGD:"m:\temp\Win32Project1\Release\Win32Project1.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Release\Win32Project1.dll.intermediate.manifest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
Что касается CRT, снова позвольте VC сделать всю работу за вас. Пусть VC выбрал Runtime Library:
/Yu"stdafx.h" /GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Fd"Release\vc140.pdb" /Zc:inline /fp:precise /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "WIN32PROJECT1_EXPORTS" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\Win32Project1.pch"
Если вы настаиваете на том, чтобы делать что-то вручную, вот несколько интересных чтений:
Других решений пока нет …