簡體   English   中英

如何使用 CLion 和 MSVC 編譯器工具鏈編譯 wxWidgets Hello World 應用程序而不會出錯?

[英]How do I compile a wxWidgets Hello World app with CLion and the MSVC compiler toolchain without errors?

我正在嘗試使用 CLion 和 MSVC(Visual Studio 2017 社區版)編譯器工具鏈編譯基本的 wxWidgets(wxWidgets 版本 3.1.3)Hello World 應用程序。

使用https://www.wxwidgets.org/downloads/上提供的預編譯二進制文件。 請參閱最新開發版本:3.1.3 下的第一個下載 Windows 二進制文件按鈕。 我正在使用 64 位版本的二進制文件。

按照https://www.wxwidgets.org/blog/2012/08/how-to-use-294-wxmsw-binaries/中有關如何使用二進制文件的說明進行操作。

按照https://www.jetbrains.com/help/clion/quick-tutorial-on-configuring-clion-on-windows.html#MSVC中的說明,了解如何設置 CLion 20.04 以使用 MSVC 編譯器。 架構設置為amd64 ,沒有平台。

Hello World 代碼,注釋的是wxIMPLEMENT_APP(MyApp)宏最終擴展為:

#include <iostream>
#include <wx/wxprec.h>

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

class MyApp : public wxApp {
public:
    virtual bool OnInit();
};

class MyFrame : public wxFrame {
public:
    MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size);

private:
    void OnHello(wxCommandEvent &event);
    void OnExit(wxCommandEvent &event);
    void OnAbout(wxCommandEvent &event);

wxDECLARE_EVENT_TABLE();
};

enum {
    ID_Hello = 1
};

wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
                EVT_MENU(ID_Hello, MyFrame::OnHello)
                EVT_MENU(wxID_EXIT, MyFrame::OnExit)
                EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
wxEND_EVENT_TABLE()

wxIMPLEMENT_APP(MyApp);
/* This is what the macro expands to:
extern "C" int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, wxCmdLineArgType, int nCmdShow) {
    ;;
    return wxEntry(hInstance, hPrevInstance, 0, nCmdShow);
}
MyApp &wxGetApp() { return *static_cast<MyApp *>(wxApp::GetInstance()); }
wxAppConsole *wxCreateApp() {
    wxAppConsole::CheckBuildOptions(
            "3" "." "1" "." "3" " (" "wchar_t" ",Visual C++ " "1900" ",wx containers" ",compatible with 3.0" ")",
            "your program");
    return new MyApp;
}

wxAppInitializer wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp)
 */

bool MyApp::OnInit() {
    MyFrame *frame = new MyFrame("Hello World", wxPoint(50, 50), wxSize(450, 340));
    frame->Show(true);
    return true;
}

MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size)
        : wxFrame(NULL, wxID_ANY, title, pos, size) {
    wxMenu *menuFile = new wxMenu;
    menuFile->Append(ID_Hello, "&Hello...\tCtrl-H",
                     "Help string shown in status bar for this menu item");
    menuFile->AppendSeparator();
    menuFile->Append(wxID_EXIT);
    wxMenu *menuHelp = new wxMenu;
    menuHelp->Append(wxID_ABOUT);
    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append(menuFile, "&File");
    menuBar->Append(menuHelp, "&Help");
    SetMenuBar(menuBar);
    CreateStatusBar();
    SetStatusText("Welcome to wxWidgets!");
}

void MyFrame::OnExit(wxCommandEvent &event) {
    Close(true);
}

void MyFrame::OnAbout(wxCommandEvent &event) {
    wxMessageBox("This is a wxWidgets' Hello world sample",
                 "About Hello World", wxOK | wxICON_INFORMATION);
}

void MyFrame::OnHello(wxCommandEvent &event) {
    wxLogMessage("Hello world from wxWidgets!");
}

cmakelists.txt 內容:

cmake_minimum_required(VERSION 3.16)
project(MyApp)

set(CMAKE_CXX_STANDARD 14)
set(SRC_FILES
    main.cpp
    )

add_definitions(-DWXUSINGDLL=1)
add_definitions(-DwxMSVC_VERSION_AUTO=1)
add_definitions(-DwxMSVC_VERSION_ABI_COMPAT=1)
add_definitions(-DUNICODE=1)
add_definitions(-D_UNICODE=1)

include_directories(
    includes
    E:/cpp/lib/wxWin
    E:/cpp/lib/wxWin/include
    E:/cpp/lib/wxWin/include/msvc
    E:/cpp/Lib/wxWin/lib/vc14x_x64_dll
    E:/cpp/Lib/wxWin/lib/vc14x_x64_dll/mswud
)
link_directories(
    E:/cpp/Lib/wxWin/lib/vc14x_x64_dll
)

add_executable(${PROJECT_NAME} ${SRC_FILES})

當我嘗試編譯它時,我收到錯誤:

E:\cpp\lib\wxWin\include\wx/app.h(900): error C2144: syntax error: 'wxAppInitializer' should be preceded by ';'
E:\cpp\lib\wxWin\include\wx/app.h(900): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
NMAKE : fatal error U1077: '"C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\Hostx64\x64\cl.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.

來自app.h的有問題的行:

__unused extern wxAppInitializer wxTheAppInitializer;

我不敢更改app.h ,因為它是 wxWidgets 的一部分。 雖然,作為一個實驗,我注釋掉了__unused並得到了這些錯誤:

LINK Pass 1: command "C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\Manager.dir\objects1.rsp /out:Manager.exe /implib:Manager.lib /pdb:E:\cpp\dev\Manager\cmake-build-debug-msvc15\Manager.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console -LIBPATH:E:\cpp\Lib\wxWin\lib\vc14x_x64_dll kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\Manager.dir/intermediate.manifest CMakeFiles\Manager.dir/manifest.res" failed (exit code 1120) with the following output:
MSVCRTD.lib(exe_main.obj) : error LNK2019: unresolved external symbol main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
Manager.exe : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: 'C:\Apps\32\JetBrains\apps\CLion\ch-0\201.7223.86\bin\cmake\win\bin\cmake.exe' : return code '0xffffffff'
Stop.
NMAKE : fatal error U1077: '"C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.

我該如何消除這個問題?


編輯#1

我用wxWidgets-3.1.3.7z下載檔案的標題替換了標題,並得到了這些新錯誤:

LINK Pass 1: command "C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\HelloWorld.dir\objects1.rsp /out:HelloWorld.exe /implib:HelloWorld.lib /pdb:E:\cpp\dev\Manager\cmake-build-debug-msvc15\HelloWorld.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console -LIBPATH:E:\cpp\Lib\wxWin\lib\vc14x_x64_dll kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\HelloWorld.dir/intermediate.manifest CMakeFiles\HelloWorld.dir/manifest.res" failed (exit code 1120) with the following output:
MSVCRTD.lib(exe_main.obj) : error LNK2019: unresolved external symbol main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
HelloWorld.exe : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: 'C:\Apps\32\JetBrains\apps\CLion\ch-0\201.7223.86\bin\cmake\win\bin\cmake.exe' : return code '0xffffffff'
Stop.
NMAKE : fatal error U1077: '"C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Apps\32\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.

問題解決了!

附加到cmakelists.txt文件中:

set_target_properties(${PROJECT_NAME} PROPERTIES
    LINK_FLAGS /SUBSYSTEM:WINDOWS
    )

它現在構建並運行時出現以下錯誤: - 在 CLion 的運行 window 中報告:

Process finished with exit code -1073741515 (0xC0000135)
  • 當程序從終端(cmd)運行時:系統錯誤消息報告:
The code execution cannot proceed because
wxmsw313ud_core_vc14x_x64.dll was not found. Reinstalling the
program may fix this problem.

The code execution cannot proceed because
wxbase313ud_vc14x_x64.dll was not found. Reinstalling the
program may fix this problem.

將這些文件放在與HelloWorld.exe相同的文件夾中,問題就解決了。 如上面的編輯#1 所示,還需要將標題替換為wxWidgets-3.1.3.7z下載存檔的標題。

您使用的是 wxWidgets 的修改版本,官方版本在wxTheAppInitializer聲明之前沒有任何__unused 我不知道它是如何到達那里的,但是您需要將其刪除,或者完全確定,刪除所有本地標題並將它們替換為您下載wxWidgets-3.1.3-headers.7z文件中的實際標題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM