问题
在构建我的项目时,我会得到链接器错误。该项目在查找wxWidgets头时没有遇到任何问题。我查看了wxWidgets最小示例,并重新创建了它,以验证我的源代码构建是否正常工作。我在VSCode中使用cmake来使用cmake扩展进行构建。
wxWidgets cmake生成的很好,wxwidget的构建看起来也很好。我正在使用VisualStudio2022 amd64工具集进行编译。(我只为编译器安装了VS2022 Community )。
看起来它正在为库构建DLL。我更喜欢静态库,但在最初的运行中,我认为它并不重要。我按照建议将我的应用程序链接到wx::net::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:\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的指针。MainWindow使用OnInit函数显示。
ProjectName/
build/
external/
wxWidgets-3.1.6/
-CMakeLists.txt
source/
ui/
-MainWindow.hpp
-MainWindow.cpp
-ProjectName.hpp
-ProjectName.cpp
-CMakeLists.txt
我已经编译了wxWidgets库,使用它们的cmake指令来使用cmake中的子目录,这样我就可以将它添加到我的项目中。以下是CMakeLists.txt的内容
ProjectName 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)
如果有人能帮助我理解为什么让它静态地修复它,我会百分之百地接受这个答案。
https://stackoverflow.com/questions/71835743
复制相似问题