DLL 使用 cl.exe 136 未解析的外部编译
DLL compile with cl.exe 136 unresolved externals
所以基本上我正在尝试将一个 cpp 文件编译成一个将被显式实现的 dll
但是当我 运行 我的 Makefile 时:
#Build DLL in DriverApp/bin/$(IntDir)
SRC = src/DriverCore.cpp
OUT = ../DriverApp/bin/DriverCore.dll
all: $(SRC)
DLL: $(SRC)
cl.exe $(SRC) /OUT:$(OUT) /link /DLL /NOENTRY /MACHINE:X64 /SUBSYSTEM:WINDOWS
我有这个输出:
PS C:\Users\ridap\Documents\GitHub\KNX-Communication-Analyser\src\Driver\DriverCore> nmake DLL
Microsoft (R) Program Maintenance Utility Version 14.28.29337.0
Copyright (C) Microsoft Corporation. All rights reserved.
cl.exe src/DriverCore.cpp /OUT:../DriverApp/bin/DriverCore.dll /link /DLL /NOENTRY /MACHINE:X64 /SUBSYSTEM:WINDOWS
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29337 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
cl : Command line warning D9002 : ignoring unknown option '/OU'
cl : Command line warning D9002 : ignoring unknown option '/OT'
cl : Command line warning D9002 : ignoring unknown option '/O:'
cl : Command line warning D9002 : ignoring unknown option '/O.'
cl : Command line warning D9002 : ignoring unknown option '/O.'
cl : Command line warning D9002 : ignoring unknown option '/O/'
cl : Command line warning D9002 : ignoring unknown option '/OD'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/Ov'
cl : Command line warning D9002 : ignoring unknown option '/Oe'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/OA'
cl : Command line warning D9002 : ignoring unknown option '/Op'
cl : Command line warning D9002 : ignoring unknown option '/Op'
cl : Command line warning D9002 : ignoring unknown option '/O/'
cl : Command line warning D9002 : ignoring unknown option '/Ob'
cl : Command line warning D9002 : ignoring unknown option '/On'
cl : Command line warning D9002 : ignoring unknown option '/O/'
cl : Command line warning D9002 : ignoring unknown option '/OD'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/Ov'
cl : Command line warning D9002 : ignoring unknown option '/Oe'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/OC'
cl : Command line warning D9002 : ignoring unknown option '/Oo'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/Oe'
cl : Command line warning D9002 : ignoring unknown option '/O.'
cl : Command line warning D9002 : ignoring unknown option '/Ol'
cl : Command line warning D9002 : ignoring unknown option '/Ol'
DriverCore.cpp
C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.28.29333\include\ostream(746): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
src/DriverCore.cpp(28): note: see reference to function template instantiation 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)' being compiled
Microsoft (R) Incremental Linker Version 14.28.29337.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:DriverCore.exe
/DLL
/NOENTRY
/MACHINE:X64
/SUBSYSTEM:WINDOWS
DriverCore.obj
Creating library DriverCore.lib and object DriverCore.exp
libcpmt.lib(wlocale.obj) : error LNK2001: unresolved external symbol _purecall
libcpmt.lib(xlocale.obj) : error LNK2001: unresolved external symbol _purecall
DriverCore.obj : error LNK2001: unresolved external symbol _purecall
libcpmt.lib(locale0.obj) : error LNK2001: unresolved external symbol _purecall
libcpmt.lib(cout.obj) : error LNK2001: unresolved external symbol _purecall
libcpmt.lib(locale.obj) : error LNK2001: unresolved external symbol _purecall
libcpmt.lib(xlocale.obj) : error LNK2001: unresolved external symbol _invalid_parameter_noinfo_noreturn
DriverCore.obj : error LNK2001: unresolved external symbol _invalid_parameter_noinfo_noreturn
libcpmt.lib(cout.obj) : error LNK2001: unresolved external symbol _invalid_parameter_noinfo_noreturn
libcpmt.lib(locale.obj) : error LNK2001: unresolved external symbol _invalid_parameter_noinfo_noreturn
libcpmt.lib(wlocale.obj) : error LNK2001: unresolved external symbol _invalid_parameter_noinfo_noreturn
DriverCore.obj : error LNK2019: unresolved external symbol __imp_CreateFileA referenced in function "public: __cdecl SerialPort::SerialPort(void)" (??0SerialPort@@QEAA@XZ)
[...]
IBCMT.lib(utility_desktop.obj) : error LNK2019: unresolved external symbol terminate referenced in function __scrt_unhandled_exception_filter
LIBCMT.lib(utility_desktop.obj) : error LNK2019: unresolved external symbol __current_exception referenced in function __scrt_unhandled_exception_filter
LIBCMT.lib(utility_desktop.obj) : error LNK2019: unresolved external symbol __current_exception_context referenced in function __scrt_unhandled_exception_filter
DriverCore.exe : fatal error LNK1120: 138 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.28.29333\bin\HostX64\x64\cl.exe"' : return code '0x2'
Stop.
我已经尝试添加 /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"
但我有较少的未解析符号 (98) 但它仍然是一个问题
注意:该程序在 VS 上编译良好,但在使用 cl.exe 时失败
(我这样做是为了更好地理解 DLL)
cl.exe $(SRC) /OUT:$(OUT) /link /DLL /NOENTRY /MACHINE:X64 /SUBSYSTEM:WINDOWS
/OUT
是链接器选项,不是编译器选项,所以它必须在 /link
.[=18= 之后]
/NOENTRY
is used for resource-only DLLs 并阻止 CRT 的正常链接。
要解决这两个问题,请改用以下方法。
cl.exe $(SRC) /link /OUT:$(OUT) /DLL /MACHINE:X64 /SUBSYSTEM:WINDOWS
所以基本上我正在尝试将一个 cpp 文件编译成一个将被显式实现的 dll
但是当我 运行 我的 Makefile 时:
#Build DLL in DriverApp/bin/$(IntDir)
SRC = src/DriverCore.cpp
OUT = ../DriverApp/bin/DriverCore.dll
all: $(SRC)
DLL: $(SRC)
cl.exe $(SRC) /OUT:$(OUT) /link /DLL /NOENTRY /MACHINE:X64 /SUBSYSTEM:WINDOWS
我有这个输出:
PS C:\Users\ridap\Documents\GitHub\KNX-Communication-Analyser\src\Driver\DriverCore> nmake DLL
Microsoft (R) Program Maintenance Utility Version 14.28.29337.0
Copyright (C) Microsoft Corporation. All rights reserved.
cl.exe src/DriverCore.cpp /OUT:../DriverApp/bin/DriverCore.dll /link /DLL /NOENTRY /MACHINE:X64 /SUBSYSTEM:WINDOWS
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29337 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
cl : Command line warning D9002 : ignoring unknown option '/OU'
cl : Command line warning D9002 : ignoring unknown option '/OT'
cl : Command line warning D9002 : ignoring unknown option '/O:'
cl : Command line warning D9002 : ignoring unknown option '/O.'
cl : Command line warning D9002 : ignoring unknown option '/O.'
cl : Command line warning D9002 : ignoring unknown option '/O/'
cl : Command line warning D9002 : ignoring unknown option '/OD'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/Ov'
cl : Command line warning D9002 : ignoring unknown option '/Oe'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/OA'
cl : Command line warning D9002 : ignoring unknown option '/Op'
cl : Command line warning D9002 : ignoring unknown option '/Op'
cl : Command line warning D9002 : ignoring unknown option '/O/'
cl : Command line warning D9002 : ignoring unknown option '/Ob'
cl : Command line warning D9002 : ignoring unknown option '/On'
cl : Command line warning D9002 : ignoring unknown option '/O/'
cl : Command line warning D9002 : ignoring unknown option '/OD'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/Ov'
cl : Command line warning D9002 : ignoring unknown option '/Oe'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/OC'
cl : Command line warning D9002 : ignoring unknown option '/Oo'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/Oe'
cl : Command line warning D9002 : ignoring unknown option '/O.'
cl : Command line warning D9002 : ignoring unknown option '/Ol'
cl : Command line warning D9002 : ignoring unknown option '/Ol'
DriverCore.cpp
C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.28.29333\include\ostream(746): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
src/DriverCore.cpp(28): note: see reference to function template instantiation 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)' being compiled
Microsoft (R) Incremental Linker Version 14.28.29337.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:DriverCore.exe
/DLL
/NOENTRY
/MACHINE:X64
/SUBSYSTEM:WINDOWS
DriverCore.obj
Creating library DriverCore.lib and object DriverCore.exp
libcpmt.lib(wlocale.obj) : error LNK2001: unresolved external symbol _purecall
libcpmt.lib(xlocale.obj) : error LNK2001: unresolved external symbol _purecall
DriverCore.obj : error LNK2001: unresolved external symbol _purecall
libcpmt.lib(locale0.obj) : error LNK2001: unresolved external symbol _purecall
libcpmt.lib(cout.obj) : error LNK2001: unresolved external symbol _purecall
libcpmt.lib(locale.obj) : error LNK2001: unresolved external symbol _purecall
libcpmt.lib(xlocale.obj) : error LNK2001: unresolved external symbol _invalid_parameter_noinfo_noreturn
DriverCore.obj : error LNK2001: unresolved external symbol _invalid_parameter_noinfo_noreturn
libcpmt.lib(cout.obj) : error LNK2001: unresolved external symbol _invalid_parameter_noinfo_noreturn
libcpmt.lib(locale.obj) : error LNK2001: unresolved external symbol _invalid_parameter_noinfo_noreturn
libcpmt.lib(wlocale.obj) : error LNK2001: unresolved external symbol _invalid_parameter_noinfo_noreturn
DriverCore.obj : error LNK2019: unresolved external symbol __imp_CreateFileA referenced in function "public: __cdecl SerialPort::SerialPort(void)" (??0SerialPort@@QEAA@XZ)
[...]
IBCMT.lib(utility_desktop.obj) : error LNK2019: unresolved external symbol terminate referenced in function __scrt_unhandled_exception_filter
LIBCMT.lib(utility_desktop.obj) : error LNK2019: unresolved external symbol __current_exception referenced in function __scrt_unhandled_exception_filter
LIBCMT.lib(utility_desktop.obj) : error LNK2019: unresolved external symbol __current_exception_context referenced in function __scrt_unhandled_exception_filter
DriverCore.exe : fatal error LNK1120: 138 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.28.29333\bin\HostX64\x64\cl.exe"' : return code '0x2'
Stop.
我已经尝试添加 /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"
但我有较少的未解析符号 (98) 但它仍然是一个问题
注意:该程序在 VS 上编译良好,但在使用 cl.exe 时失败
(我这样做是为了更好地理解 DLL)
cl.exe $(SRC) /OUT:$(OUT) /link /DLL /NOENTRY /MACHINE:X64 /SUBSYSTEM:WINDOWS
/OUT
是链接器选项,不是编译器选项,所以它必须在/link
.[=18= 之后]/NOENTRY
is used for resource-only DLLs 并阻止 CRT 的正常链接。
要解决这两个问题,请改用以下方法。
cl.exe $(SRC) /link /OUT:$(OUT) /DLL /MACHINE:X64 /SUBSYSTEM:WINDOWS