Visual studio 使用cl.exe 136未解析外部文件编译DLL

Visual studio 使用cl.exe 136未解析外部文件编译DLL,visual-studio,dll,command-line,Visual Studio,Dll,Command Line,所以基本上,我试图将一个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

所以基本上,我试图将一个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 Studio\2019\Community\VC\Tools\MSVC\14.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 Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\HostX64\x64\cl.exe"' : return code '0x2'
Stop.
PS C:\Users\ridap\Documents\GitHub\KNX通信分析器\src\Driver\DriverCore>nmake DLL
Microsoft(R)程序维护实用程序版本14.28.29337.0
版权所有(C)微软公司。版权所有。
cl.exe src/DriverCore.cpp/OUT:../DriverApp/bin/DriverCore.dll/link/dll/NOENTRY/MACHINE:X64/子系统:WINDOWS
针对x64的Microsoft(R)C/C++优化编译器版本19.28.29337
版权所有(C)微软公司。版权所有。
cl:命令行警告D9002:忽略未知选项'/OU'
cl:命令行警告D9002:忽略未知选项'/OT'
cl:命令行警告D9002:忽略未知选项'/O:'
cl:命令行警告D9002:忽略未知选项'/O'
cl:命令行警告D9002:忽略未知选项'/O'
cl:命令行警告D9002:忽略未知选项'/O/'
cl:命令行警告D9002:忽略未知选项'/OD'
cl:命令行警告D9002:忽略未知选项“/或”
cl:命令行警告D9002:忽略未知选项'/Ov'
cl:命令行警告D9002:忽略未知选项“/Oe”
cl:命令行警告D9002:忽略未知选项“/或”
cl:命令行警告D9002:忽略未知选项'/OA'
cl:命令行警告D9002:忽略未知选项'/Op'
cl:命令行警告D9002:忽略未知选项'/Op'
cl:命令行警告D9002:忽略未知选项'/O/'
cl:命令行警告D9002:忽略未知选项'/Ob'
cl:命令行警告D9002:忽略未知选项“/On”
cl:命令行警告D9002:忽略未知选项'/O/'
cl:命令行警告D9002:忽略未知选项'/OD'
cl:命令行警告D9002:忽略未知选项“/或”
cl:命令行警告D9002:忽略未知选项'/Ov'
cl:命令行警告D9002:忽略未知选项“/Oe”
cl:命令行警告D9002:忽略未知选项“/或”
cl:命令行警告D9002:忽略未知选项'/OC'
cl:命令行警告D9002:忽略未知选项'/Oo'
cl:命令行警告D9002:忽略未知选项“/或”
cl:命令行警告D9002:忽略未知选项“/Oe”
cl:命令行警告D9002:忽略未知选项'/O'
cl:命令行警告D9002:忽略未知选项'/Ol'
cl:命令行警告D9002:忽略未知选项'/Ol'
DriverCore.cpp
程序文件(x86)\微软Visual Studio \\\Cual\\VC\Too\MSVC\1423.29 333 \包含OFSUM(746):警告C45 30:C++异常处理程序,但未启用展开语义。指定/EHsc
src/DriverCore.cpp(28):注意:请参阅函数模板实例化'std::basic_ostream&std::operator'的参考
  • 是链接器选项,而不是编译器选项,因此它必须位于
    /link
    之后

  • 用于并防止CRT的正常链接

要解决这两个问题,请使用以下方法

    cl.exe $(SRC) /link /OUT:$(OUT) /DLL /MACHINE:X64 /SUBSYSTEM:WINDOWS
    cl.exe $(SRC) /link /OUT:$(OUT) /DLL /MACHINE:X64 /SUBSYSTEM:WINDOWS