Как решить проблему «неразрешенный экстенсиальный символ _DllMainCRTStartup @ 12»?

Я хочу создать файл 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 во время компоновки некорректны или при разделении объектов в двух библиотеках что-то идет не так и некоторая информация исчезает.
Или я использую не правильные параметры для компилятора и компоновщика.

Может ли кто-нибудь помочь мне решить это?

-1

Решение

Это не прямой ответ на ваш вопрос, а объяснение на простом английском языке того, в чем может быть проблема.

Если вы вызываете функцию, вы должны сначала предоставить объявление для нее. Компилятор проверит ваш вызов на предмет объявления. Если функция является библиотечной функцией, компилятор будет искать ее в одном из файлов интерфейса библиотеки (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"

Если вы настаиваете на том, чтобы делать что-то вручную, вот несколько интересных чтений:

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]