Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Ninja使用CMake构建的Unicode MFC应用程序中未解决的WinMain错误_C++_Cmake_Mfc_Ninja - Fatal编程技术网

C++ 使用Ninja使用CMake构建的Unicode MFC应用程序中未解决的WinMain错误

C++ 使用Ninja使用CMake构建的Unicode MFC应用程序中未解决的WinMain错误,c++,cmake,mfc,ninja,C++,Cmake,Mfc,Ninja,下面是一个显示此问题的最小项目。它由两个文件组成:CMakeLists.txt和hellomfc.cpp CMakeLists.txt cmake_minimum_required(VERSION 3.18) project(HelloMFC) set(CMAKE_MFC_FLAG 2) add_executable(HelloMFC WIN32 hellomfc.cpp) target_compile_definitions(HelloMFC PRIVATE _AFXDLL _UNICODE

下面是一个显示此问题的最小项目。它由两个文件组成:CMakeLists.txt和hellomfc.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 3.18)
project(HelloMFC)
set(CMAKE_MFC_FLAG 2)
add_executable(HelloMFC WIN32 hellomfc.cpp)
target_compile_definitions(HelloMFC PRIVATE _AFXDLL _UNICODE UNICODE)
hellomfc.cpp

#include <afxwin.h>

class CMainFrame : public CFrameWnd {
public:
  CMainFrame() { Create(NULL, _T("Windows App")); }
};
class CApp : public CWinApp {
  CMainFrame *Frame;
  BOOL InitInstance() {
    Frame = new CMainFrame();
    m_pMainWnd = Frame;

    Frame->ShowWindow(SW_SHOW);
    Frame->UpdateWindow();

    return TRUE;
  }
};

CApp theApp;
但是使用忍者生成器失败,出现了一个“无法解析的符号”_WinMain@16“错误:


请注意,在取出
\u UNICODE
编译定义时,构建可以同时使用两个生成器。但是,此特定项目需要unicode版本。

可能是CMake中的错误,但您可以明确指定应用程序入口点:

# CMakeLists.txt

...

target_link_options(${PROJECT_NAME} PRIVATE "/entry:wWinMainCRTStartup")

因此,它应该可以修复您的错误。

您为什么要在这里发帖?你一个问题也没问。如果您觉得CMake有一个错误,那么您不应该在FYI上报告吗?<代码> CMACHYMFCFLAGE/<代码>文档状态>代码>允许使用微软基础类(MFC)。静态MFC库应设置为1,共享MFC库应设置为2。这在Visual Studio项目文件中使用。。谢谢,我将在CMake问题跟踪程序上报告这一点。我想问题应该是“有可能用忍者生成器构建unicode MFC应用程序吗?”。关于
CMAKE_MFC_FLAG
,根据文档所述,它在非unicode版本中与Ninja一起工作,这令人惊讶。这里是一个链接,指向CMAKE问题以供参考:
C:\Users\rdeterre\Documents\hello-mfc\build-ninja>cmake .. -GNinja
-- The C compiler identification is MSVC 19.27.29111.0
-- The CXX compiler identification is MSVC 19.27.29111.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/14.27.29110/bin/Hostx86/x86/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/14.27.29110/bin/Hostx86/x86/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/rdeterre/Documents/hello-mfc/build-ninja

C:\Users\rdeterre\Documents\hello-mfc\build-ninja>cmake --build .
[1/2] Building CXX object CMakeFiles\HelloMFC.dir\hellomfc.cpp.obj
_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
[2/2] Linking CXX executable HelloMFC.exe
FAILED: HelloMFC.exe
cmd.exe /C "cd . && C:\Users\rdeterre\scoop\apps\cmake\3.18.1\bin\cmake.exe -E vs_link_exe --intdir=CMakeFiles\HelloMFC.dir --rc=C:\PROGRA~2\WI3CF2~1\10\bin\100190~1.0\x86\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100190~1.0\x86\mt.exe --manifests  -- C:\PROGRA~2\MICROS~1\2019\PROFES~1\VC\Tools\MSVC\1427~1.291\bin\Hostx86\x86\link.exe /nologo CMakeFiles\HelloMFC.dir\hellomfc.cpp.obj  /out:HelloMFC.exe /implib:HelloMFC.lib /pdb:HelloMFC.pdb /version:0.0 /machine:X86 /debug /INCREMENTAL /subsystem:windows  kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK Pass 1: command "C:\PROGRA~2\MICROS~1\2019\PROFES~1\VC\Tools\MSVC\1427~1.291\bin\Hostx86\x86\link.exe /nologo CMakeFiles\HelloMFC.dir\hellomfc.cpp.obj /out:HelloMFC.exe /implib:HelloMFC.lib /pdb:HelloMFC.pdb /version:0.0 /machine:X86 /debug /INCREMENTAL /subsystem:windows kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\HelloMFC.dir/intermediate.manifest CMakeFiles\HelloMFC.dir/manifest.res" failed (exit code 1120) with the following output:
msvcrtd.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
HelloMFC.exe : fatal error LNK1120: 1 unresolved externals
ninja: build stopped: subcommand failed.
# CMakeLists.txt

...

target_link_options(${PROJECT_NAME} PRIVATE "/entry:wWinMainCRTStartup")