【问题标题】:wxWidgets minimal.cpp liner error in function `wxString::ImplStr(char const*, wxMBConv const&)'函数 `wxString::ImplStr(char const*, wxMBConv const&)' 中的 wxWidgets minimum.cpp 线性错误
【发布时间】:2020-08-03 14:38:12
【问题描述】:

从示例目录编译和链接 minimum.cpp 文件时出现此错误

g++ -o "SampleMinimal" ./src/minimal.o   -lwx_mswu_xrc-3.0-x86_64-w64-mingw32 -lwx_mswu_webview-3.0-x86_64-w64-mingw32 -lwx_mswu_html-3.0-x86_64-w64-mingw32 -lwx_mswu_qa-3.0-x86_64-w64-mingw32 -lwx_mswu_adv-3.0-x86_64-w64-mingw32 -lwx_mswu_core-3.0-x86_64-w64-mingw32 -lwx_baseu_xml-3.0-x86_64-w64-mingw32 -lwx_baseu_net-3.0-x86_64-w64-mingw32 -lwx_baseu-3.0-x86_64-w64-mingw32 -L/usr/x86_64-w64-mingw32/sys-root/mingw/lib -Wl,--subsystem,windows -mwindows -Wl,--enable-auto-import
/usr/lib/gcc/x86_64-pc-cygwin/9.3.0/../../../../x86_64-pc-cygwin/bin/ld: ./src/minimal.o: in function `wxString::ImplStr(char const*, wxMBConv const&)':
/usr/x86_64-w64-mingw32/sys-root/mingw/include/wx-3.0/wx/string.h:477: undefined reference to `wxString::ConvertStr(char const*, unsigned long, wxMBConv const&)'
/usr/x86_64-w64-mingw32/sys-root/mingw/include/wx-3.0/wx/string.h:477:(.text$_ZN8wxString7ImplStrEPKcRK8wxMBConv[_ZN8wxString7ImplStrEPKcRK8wxMBConv]+0x3a): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `wxString::ConvertStr(char const*, unsigned long, wxMBConv const&)'
collect2: error: ld returned 1 exit status

成功创建目标文件。

编译器命令行:

g++ -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXMSW__ -I/usr/x86_64-w64-mingw32/sys-root/mingw/lib/wx/include/x86_64-w64-mingw32-msw-unicode-3.0 -I"/usr/x86_64-w64-mingw32/sys-root/mingw/include/wx-3.0" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/minimal.d" -MT"src/minimal.o" -o "src/minimal.o" "../src/minimal.cpp"
Finished building: ../src/minimal.cpp

链接器命令行:

g++ -o "SampleMinimal" ./src/minimal.o   -lwx_mswu_xrc-3.0-x86_64-w64-mingw32 -lwx_mswu_webview-3.0-x86_64-w64-mingw32 -lwx_mswu_html-3.0-x86_64-w64-mingw32 -lwx_mswu_qa-3.0-x86_64-w64-mingw32 -lwx_mswu_adv-3.0-x86_64-w64-mingw32 -lwx_mswu_core-3.0-x86_64-w64-mingw32 -lwx_baseu_xml-3.0-x86_64-w64-mingw32 -lwx_baseu_net-3.0-x86_64-w64-mingw32 -lwx_baseu-3.0-x86_64-w64-mingw32 -L/usr/x86_64-w64-mingw32/sys-root/mingw/lib -Wl,--subsystem,windows -mwindows -Wl,--enable-auto-import

【问题讨论】:

  • 您使用的是 MSYS 1 还是 MSYS 2?您是自己构建的库还是使用预构建的库?
  • Igor 感谢您回答不确定 MSYS 1 和 MSYS 2 之间的区别。我从 cygwin 内部安装了 MinGw 和 wxWidget 库。所以我使用的是预制的。我怎么知道我有哪个 MSYS? uname -a 显示:CYGWIN_NT-10.0 ENGWSL201908-16 3.1.4(0.340/5/3) 2020-02-19 08:49 x86_64 Cygwin。
  • 很抱歉,您根本不清楚您在做什么以及为什么要显示这些编译器/链接器命令行。他们来自哪里?你似乎既没有使用samples/minimal/makefile.unx,也没有使用配置生成的samples/minimal/Makefile,那么你是怎么得到它们的呢?另外,您真的要构建库的 Cygwin 版本吗?如果是这样,你有什么好的理由这样做吗?如果没有,我强烈建议使用 MinGW 编译器之一来构建。
  • @JeffreyJacobs,您可能下载了不兼容的 wxWidgets 版本,该版本是使用您使用的不同编译器构建的。正如 Vadim 建议的那样,最好的方法是使用 configure 自己构建库,然后在自己的项目中使用它。
  • 对不起 Igor StackOverflow 新手。我正在使用 Eclipse 进行编译和链接。我为 Eclipse、Cygwin 和 wxWidgets 创建了一个标签,所以我认为 Eclipse 是创建编译器和链接器命令的方式很明显。我之前已经下载了源代码但未能编译,所以在获得二进制文件后,我将 wxWidget 源中的 minimum.cpp 代码导入 Eclipse。您可以在下面看到我能够构建和运行代码。再次感谢。

标签: c++ windows eclipse cygwin wxwidgets


【解决方案1】:

您显然是在调试模式下编译minimal 示例,请参阅-g3 标志,然后尝试链接到发布mswu 库。

因此要么将示例编译更改为发布模式,要么将链接器命令更改为使用mswud 调试库。

【讨论】:

  • 卡特林感谢您的帮助。我应该意识到我没有使用调试库。我相信我只在 Cygwin 中安装了发布二进制文件,所以我将 Eclipse 构建配置更改为发布。我仍然看到这个错误 ./src/minimal.o:minimal.cpp:(.text+0x145): undefined reference to `wxString::ConvertStr(char const*, unsigned long, wxMBConv const&)'
    08: 25:12 构建失败。 18 个错误,0 个警告。 (耗时 7s.120ms)所有 18 个错误都是对 wxString::ConvertStr 的未定义引用。
【解决方案2】:

通过在 Eclipse 的 C/C++ 构建设置中为 GCC C++ 编译器和 MinGW C++ 链接器创建 Command: x86_64-w64-mingw32-g++ 解决了该问题。我认为这是通过选择 MinGW 工具链自动完成的。非常感谢 Catalin 指出我在调试构建配置中链接了发布库。他对我的构建配置发布的回答让我更进一步。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2017-03-29
    • 2013-11-09
    相关资源
    最近更新 更多