wxWidgets未使用来自VSCode(MSVC)的Cmake进行链接



问题

我在构建项目时遇到链接器错误。该项目在查找wxWidgets标头时没有问题。我查看了wxWidgets的最小示例,并重新创建了它,以验证我的源代码构建是否正常工作。我在VSCode中使用了cmake来使用cmake扩展进行构建。

wxWidgets cmake生成得很好,wxWidget的构建看起来也很好。我正在使用Visual Studio 2022 amd64工具集进行编译。(我只为编译器安装了VS2022社区版(。

看起来它正在为库构建DLL。我更喜欢静态库,但对于最初的运行,我认为这并不重要。我根据建议将我的应用程序链接到wx::net wx::core wx::base。我想这会照顾到链接时,我去建设。

当我使用wxWidgets库构建整个应用程序时,我会收到这些链接器错误。我在这里做错了什么?很明显,我没有为它找到库正确地配置一些东西,但我在这里有点困惑。

链接器错误

[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:pathtoexecutableProjectName.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函数显示主窗口。

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

我已经使用他们的cmake指令编译了wxWidgets库,以便在cmake中使用子目录,这样我就可以将其添加到我的项目中。以下是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)

项目名称/外部CMakeLists.txt

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

更新

我更改了用于构建共享库(DLL(的Cmake选项,并将其设置为OFF。完成此操作后,它将构建一个静态库(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。完成此操作后,它将构建一个静态库(LIB(。这似乎解决了我的链接问题。

不幸的是,我没有看到任何人能够插话帮助理解为什么这是一个解决方案,但我将选择这一点作为未来其他人的答案。

如果我看到任何更新回答了";为什么";我会接受他们的回答。

最新更新