[英]wxWidgets and wxPDFDoc crash on init
由於我看不到的明顯原因,我在程序初始化時遇到了崩潰。 我的調用棧是:
1 std::char_traits<wchar_t>::assign char_traits.h 420 0x5555557691cf
2 std::wstring::_M_set_length basic_string.h 221 0x55555576c865
3 std::wstring::_M_assign basic_string.tcc 274 0x55555576da33
4 std::wstring::assign basic_string.h 1370 0x55555576cc1b
5 std::wstring::operator= basic_string.h 700 0x55555576bb38
6 wxString::operator= string.h 1892 0x5555557697a5
7 wxFileName::Assign filename.cpp 405 0x55555616e130
8 wxFileName::Assign filename.cpp 529 0x55555616e723
9 wxFileName::wxFileName filename.h 149 0x555555824988
10 wxPathList::Add filefn.cpp 118 0x555556167e06
11 wxPdfFontManagerBase::wxPdfFontManagerBase string.h 3603 0x555555db8a8a
12 wxPdfFontManager::wxPdfFontManager pdffontmanager.cpp 1642 0x555555db8c30
13 wxPdfDocumentModule::OnInit pdffontmanager.cpp 1817 0x555555db8c70
14 wxModule::Init module.h 33 0x555556193e59
15 wxModule::DoInitializeModule module.cpp 137 0x5555561931b6
16 wxModule::InitializeModules module.cpp 168 0x555556193811
17 DoCommonPostInit init.cpp 282 0x555556181729
18 wxEntryStart init.cpp 348 0x555556181ae0
19 wxInitialize init.cpp 541 0x555556181f76
20 wxInitializer::wxInitializer init.h 92 0x555556182221
21 wxEntry init.cpp 474 0x555556181d53
22 wxEntry init.cpp 516 0x555556181ebe
23 main myprogram.cpp 490 0x555555766ebc
在這里,__c1 不存在於內部
static _GLIBCXX17_CONSTEXPR void
assign(char_type& __c1, const char_type& __c2) _GLIBCXX_NOEXCEPT
{ __c1 = __c2; }
在使用 wxPdfDoc 代碼之前,其他 wxStrings 被愉快地分配給。 我必須確保 wxPdfDocument 在我的 CMakeLists 中的其他庫之前被鏈接,否則我會得到 Static Initialization Order Fiasco。 即_GLOBAL__sub_I_strconv.cpp () from /usr/local/lib/libwx_baseu
的“程序接收信號 SIGFPE,算術異常”,其中wxCSConv::DoCreate
失敗。 我認為這是在 wxWidgets 初始化之前初始化的 wxpdfdoc 庫中某處的某個 static,但我不知道庫鏈接順序更簡單的解決方法在哪里。
因此,我是這樣target_link_libraries(${PROJECT_NAME} PRIVATE -lpthread -lwxcode_gtk3u_pdfdoc-3.1 ${wxWidgets_LIBRARIES} ${MYSQL_LIBS} -lodbc)
的:
我還確保它指向使用我自己的 wxWidgets 樹而不是系統 wxGTK 的東西:
set(wxWidgets_CONFIG_EXECUTABLE /home/rich/wxWidgets/build-debug/wx-config)
set(wxWidgets_ROOT_DIR /home/rich/wxWidgets)
set(wxWidgets_LIB_DIR /home/rich/wxWidgets/build-debug/lib)
set(wxWidgets_INCLUDE_DIRS /home/rich/wxWidgets/build-debug/lib/wx/include/gtk3-unicode-static-3.1)
find_package(wxWidgets COMPONENTS core base webview qa adv aui html propgrid ribbon richtext stc xml REQUIRED)
include(${wxWidgets_USE_FILE})
link_directories(/home/rich/wxpdfdoc/build-gtk/.libs)
我正在使用 Ubuntu 20.04 並使用 Git 分支,構建我自己的樹版本。 對於我正在使用的 wxWidgets(是的,我知道很多是默認設置,但我很明確):
../configure --disable-shared --enable-unicode --prefix="$(pwd)" --enable-stc --enable-ipc --enable-base64 --enable-exceptions --enable-fontenum --enable-fs_archive --enable-stdpaths --enable-sysoptions --enable-threads --enable-url --enable-aui --enable-graphics_ctx --enable-printarch --enable-timer --enable-ribbon --enable-webview --enable-display --enable-splash --enable-snglinst --enable-printfposparam --with-opengl --with-expat=builtin --with-cxx=11 --enable-cxx11 --enable-stl --enable-std_iostreams --enable-std_string --enable-ftp --enable-http --enable-fileproto --enable-sockets --enable-ipv6 --enable-dataobj --enable-ipc --enable-any --enable-arcstream --enable-backtrace --enable-cmdline --enable-datetime --enable-debugreport --enable-dynamicloader --enable-exceptions --enable-ffile --enable-file --enable-filehistory --enable-filesystem --enable-fontmap --enable-fs_inet --enable-fs_zip --enable-fsvolume --enable-fswatcher --enable-geometry --enable-sound --enable-stopwatch --enable-streams --enable-tarstream --enable-textbuf --enable-textfile --enable-variant --enable-zipstream --enable-protocol --enable-protocol-http --enable-protocol-ftp --enable-protocol-file --enable-html --enable-htmlhelp --enable-propgrid --enable-svg --enable-clipboard --enable-dnd --enable-accel --enable-debug --with-libpng=builtin --with-libjpeg=builtin --with-zlib=builtin --with-libtiff=builtin --with-libcurl --with-gtk=3 --with-cxx=17 CXXFLAGS=-std=c++17
對於 wxPDFDoc,我正在使用:
../configure --with-wx-config=/home/rich/wxWidgets/build-debug/wx-config --disable-shared
我完全不知道為什么會發生這種情況 - 任何指示將不勝感激!
您在構建 wxPdfDoc 時似乎沒有指定-std=c++17
,因此除非您的編譯器默認使用 C++17,否則它不會使用與 wxWidgets 相同的編譯選項,這是災難的根源。 您需要使用完全相同的選項(當然還有相同的編譯器)來構建所有內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.