я использую cl
компилятор и LINK
связать код. Я получаю очень странный компоновщик в следующем примере кода.
//main.cpp
int main ()
{
Test();
}
void Test ()
{
}
//test.cpp
void Test3 ();
void Test2 ()
{
Test3 ();
}
Когда я компилирую main.cpp с test.cpp, то это дает мне ошибку компоновщика, что Test3
undefined, который на самом деле не должен ссылаться. Когда я удаляю test.cpp из моего make-файла, он без проблем компилируется и связывается.
Я использую библиотеку Skia. Возможно ли, что эта проблема связана с библиотекой skia и несовпадением опций ссылок?
Параметры компоновщика моего компилятора перечислены ниже:
Опции компилятора:
/c /W4 /nologo /WL /Gr /GF /GA /Gy /GR- /vmb /EHsc /D_UNICODE /DUNICODE /D_CRT_SECURE_NO_WARNINGS /D_CRT_NON_CONFORMING_SWPRINTFS /DWIN32 /D_WIN32 /MT /Z7 /O2 /GS- /Oi
Параметры линкера:
LINK skia_core.lib skia_utils.lib skia_effects.lib skia_images.lib skia_opts.lib skia_opts_ssse3.lib skia_ports.lib skia_sfnt.lib skia_skgpu.lib /INCREMENTAL:NO /NOLOGO /OPT:REF /IGNORE:4098 /IGNORE:4089 /SUBSYSTEM:WINDOWS /FIXED:NO /NODEFAULTLIB:advapi32.lib /NODEFAULTLIB:user32.lib /NODEFAULTLIB:gdi32.lib /NODEFAULTLIB:shell32.lib /NODEFAULTLIB:comdlg32.lib /NODEFAULTLIB:version.lib /NODEFAULTLIB:mpr.lib /NODEFAULTLIB:rasapi32.lib /DEFAULTLIB:winmm.lib /NODEFAULTLIB:winspool.lib /NODEFAULTLIB:vfw32.lib /NODEFAULTLIB:secur32.lib /NODEFAULTLIB:oleacc.lib /NODEFAULTLIB:oledlg.lib /NODEFAULTLIB:sensapi.lib /NODEFAULTLIB:kernel32.lib /NODEFAULTLIB:wininet.lib /NODEFAULTLIB:wsock32.lib /NODEFAULTLIB:odbc32.lib /NODEFAULTLIB:odbccp32.lib /NODEFAULTLIB:htmlhelp.lib /NODEFAULTLIB:comctl32.lib /NODEFAULTLIB:libc.lib unicows.lib kernel32.lib user32.lib winspool.lib gdi32.lib Rpcrt4.lib netapi32.lib wininet.lib wsock32.lib odbc32.lib odbccp32.lib htmlhelp.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib version.lib mpr.lib rasapi32.lib winmm.lib vfw32.lib secur32.lib oleacc.lib oledlg.lib DbgHelp.lib shlwapi.lib mstask.lib taskschd.lib psapi.lib crypt32.lib /VERSION:1.0 skia_core.lib skia_utils.lib skia_effects.lib skia_images.lib skia_opts.lib skia_opts_ssse3.lib skia_ports.lib skia_sfnt.lib skia_skgpu.lib /MAP /DEBUG /OPT:REF /NODEFAULTLIB:LIBCMTD.LIB psapi.lib crypt32.lib usp10.lib Opengl32.lib Gdiplus.lib /RELEASE /OUT:test.exe
Сообщение об ошибке компоновщика:
LNK2019: unresolved external symbol "void __fastcall Test3(void)" (?Test3@@YIXXZ) referenced in function "void __fastcall Test2(void)" (?Test2@@YIXXZ)
Функция Test3 только что объявлена, но не определена. Вам нужно написать код для этого.
Вы ожидаете, что компоновщик обнаружит, что Test3 не нужен, даже если он вызывается из Test2, потому что Test2 никогда не вызывается. Вы не можете принять это как должное, поскольку это не гарантировано в стандарте.
Других решений пока нет …