簡體   English   中英

wxWidgets 未使用來自 VSCode (MSVC) 的 Cmake 進行鏈接

[英]wxWidgets not linking using Cmake from VSCode (MSVC)

問題

構建項目時出現 linker 錯誤。 該項目可以輕松找到 wxWidgets 標頭。 我查看了 wxWidgets 最小示例並重新創建它以驗證我從源代碼構建的是否正常工作。 我在 VSCode 中使用 cmake 來使用 cmake 擴展進行構建。

wxWidgets cmake 生成正常並且 wxwidgets 的構建似乎進行得很好。 我正在使用 Visual Studio 2022 amd64 工具集進行編譯。 (我只為編譯器安裝了 VS2022 Community Edition)。

看起來它正在為圖書館建造 DLL。 我更喜歡 static 庫,但對於初始運行我認為這並不重要。 我按照建議將我的應用程序鏈接到 wx:.net wx::core wx::base。 我認為這會在我 go 構建時處理鏈接。

當我 go 使用 wxWidgets 庫構建我的整個應用程序時,我得到這些 linker 錯誤。 我在這里做錯了什么? 我顯然沒有正確配置一些東西來找到圖書館,但我在這里有點難過。

Linker 錯誤

[build] ProjectName.obj : error LNK2001: unresolved external symbol "protected: static class wxAppConsole * (__cdecl* wxAppConsoleBase::ms_appInitFn)(void)" -snipped-
[build] ProjectName.obj : error LNK2001: unresolved external symbol "protected: static class wxAppConsole * wxAppConsoleBase::ms_appInstance" -snipped-
[build] MainWindow.obj : error LNK2001: unresolved external symbol "void (__cdecl* wxTheAssertHandler)(class wxString const &,int,class wxString const &,class wxString const &,class wxString const &)"-snipped-
[build] MainWindow.obj : error LNK2001: unresolved external symbol "bool wxTrapInAssert" (?wxTrapInAssert@@3_NA) -snipped-
[build] MainWindow.obj : error LNK2001: unresolved external symbol "class wxMBConv * wxConvLibcPtr" (?wxConvLibcPtr@@3PEAVwxMBConv@@EA) -snipped-
[build] MainWindow.obj : error LNK2001: unresolved external symbol "public: static unsigned __int64 const wxString::npos" (?npos@wxString@@2_KB)-snipped-
[build] MainWindow.obj : error LNK2001: unresolved external symbol "class wxSize const wxDefaultSize" (?wxDefaultSize@@3VwxSize@@B)-snipped-
[build] MainWindow.obj : error LNK2001: unresolved external symbol "class wxPoint const wxDefaultPosition" (?wxDefaultPosition@@3VwxPoint@@B)-snipped-
[build] MainWindow.obj : error LNK2001: unresolved external symbol "char const * const wxFrameNameStr" (?wxFrameNameStr@@3QBDB)-snipped-
[build] C:\path\to\executable\ProjectName.exe : fatal error LNK1120: 9 unresolved externals -snipped-
[build] Build finished with exit code 1 

項目布局

非常基本的項目布局。 我正在構建一個 GUI 應用程序,我在邏輯上分離出 ui 源代碼。

這基本上是對最小 wxWidgets 示例的重新創建,其中您有一個入口點(Projectname.hpp 和 ProjectName.cpp 提供了這個)和一個主窗口/框架(MainWindow.hpp 和 MainWindow.cpp 提供了這個)。 ProjectName 應用程序將執行 wxIMPLEMENT_APP(ProjectName) 並將持有指向 MainWindow 的指針。 使用 OnInit Function 顯示 MainWindow。

ProjectName/
    build/
    external/
        wxWidgets-3.1.6/
        -CMakeLists.txt
    source/
        ui/
            -MainWindow.hpp
            -MainWindow.cpp
        -ProjectName.hpp
        -ProjectName.cpp
    -CMakeLists.txt

我已經使用他們的cmake 說明使用 cmake 中的子目錄編譯了 wxWidgets 庫,因此我可以將它添加到我的項目中。 以下是 CMakeLists.txt 的內容

項目名稱 CMakeLists.txt

cmake_minimum_required(VERSION 3.23)

set(MAJOR 0)
set(MINOR 0)
set(PATCH 1)

#Setup Project
project(ProjectNameProject VERSION ${MAJOR}.${MINOR}.${PATCH}
                           DESCRIPTION "ProjectName Descrip"
                           LANGUAGES CXX)

add_executable(ProjectName WIN32 ${PROJECT_SOURCE_DIR}/source/ProjectName.cpp 
                             ${PROJECT_SOURCE_DIR}/source/ui/MainWindow.cpp)

target_include_directories(ProjectName PRIVATE ${PROJECT_SOURCE_DIR}/source)
target_include_directories(ProjectName PRIVATE ${PROJECT_SOURCE_DIR}/source/ui)

target_link_libraries(ProjectName PRIVATE wx::net wx::core wx::base)

add_subdirectory(${CMAKE_SOURCE_DIR}/external)

項目名稱/externals CMakeLists.txt

cmake_minimum_required(VERSION 3.23)
add_subdirectory(${CMAKE_SOURCE_DIR}/external/wxWidgets-3.1.6)

更新

我更改了用於構建共享庫 (DLL) 的 Cmake 選項並將其設置為 OFF。 完成后,它會構建一個 static 庫 (LIB)。 這似乎解決了我的鏈接問題。

根據 Igor 的建議,我再次查看了最小樣本 CMakeLists.txt 並注意到他們使用以下行進行鏈接

target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES}) 

也許我的行(下面)是靜態鏈接的方式並且不適用於 DLL?

target_link_libraries(ProjectName PRIVATE wx::net wx::core wx::base)

如果有人可以幫助我理解為什么要靜態構建它並修復它,我會 100% 接受這個答案。

我更改了用於構建共享庫 (DLL) 的 Cmake 選項並將其設置為 OFF。 完成后,它會構建一個 static 庫 (LIB)。 這似乎解決了我的鏈接問題。

不幸的是,我沒有看到任何人能夠插話來幫助理解為什么這是解決方案,但我將撥打 select 作為未來其他人的答案。

如果我看到任何更新回答“為什么”這個問題,我會接受他們的回答。

暫無
暫無

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

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