gpt4 book ai didi

c++ - 对 wxLog::DoLog 的 undefined reference 错误构建 wxHaskell 针对 wxWidget 3.0

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:39 25 4
gpt4 key购买 nike

我正在尝试为 wxWidgets 3.0 构建 wxHaskell。我使用了来自 https://github.com/wxHaskell/wxHaskell 的最新 git 版本的 wxHaskell .

我尝试按照 wxHaskell-master.zip 中的 install.txt 操作,到目前为止我所做的是:

cd wxdirect
cabal install
cd ../wxc
cabal install

wxc 无法编译,因为它的 Setup.hs 需要 wxWidgets 2.9。我换了

let wxRequiredVersion = "2.9"

let wxRequiredVersion = "3.0"

然后做了:

cabal install --extra-lib-dirs=/usr/local/lib

所有编译都正常,但最后出现了一些链接错误。最难解决的问题如下:

dist\build\src\cpp\eljlog.o:eljlog.cpp:(.rdata$_ZTV6ELJLog[vtable for ELJLog]+0x20): undefined reference to `wxLog::DoLog(unsigned long, char const*, long)'

对应的源码在wxc/src/cpp/eljlog.cpp:

class ELJLog : public wxLog
{
private:
TLogFunc func;
void* EiffelObject;

protected:
virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t)
{
wxString s(szString);
func (EiffelObject, (int)level, (void*)&s , (int)t);
}
....

我不知道是什么原因导致了这个错误以及如何修复它。我对这个 vtable 问题做了一些搜索,有人认为这是由于在子类中声明了一个虚函数而没有定义它造成的。其他人建议这是目标文件在 g++ 命令行上给出的顺序。但这里似乎都不是这种情况。我尝试删除函数 ELJLog::DoLog 函数或注释掉 virtual 关键字。奇怪的是,即使没有出现 DoLog,总是有一个链接错误/错误说明一些关于 ELJLog 的 vtable,并引用 wxLog::DoLog。

此外,作为旁注,wxLog::DoLog 似乎在 wxWidgets 3.0 文档中丢失了。我不确定此功能是否已弃用。但是,它仍然以我无法理解的方式导致遗留派生类出错。

知道这里发生了什么吗?

--- 编辑2 ---

如果我注释掉有问题的函数

virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t) ...

我得到了如下不同的链接错误:

dist\build\src\cpp\eljlog.o:eljlog.cpp:(.rdata$_ZTV6ELJLog[vtable for ELJLog]+0x
20): undefined reference to `wxLog::DoLog(unsigned long, char const*, long)'
dist\build\src\cpp\eljlog.o:eljlog.cpp:(.rdata$_ZTV6ELJLog[vtable for ELJLog]+0x
24): undefined reference to `wxLog::DoLog(unsigned long, wchar_t const*, long)'
collect2: ld returned 1 exit status

--- 编辑 ---

我在 mingw.org 的 mingw32 下从事这项工作。我从源码构建了wxWidgets 3.0.0稳定版,我做的stpes如下:

per http://mingw.5.n7.nabble.com/win32api-version-4-td32288.html :
edit line 2217 of /c/mingw/{,mingw32/}include/commctrl.h to read
#define TV_DISPINFO NMTVDISPINFO
instead of
#define TV_DISPINFO __AW(NMTVDISPINFO)
The above was needed to fix a MinGW32 4.8.1-4 issue. Then,

./configure --enable-stl --disable-shared
make
make install

./configure --enable-stl
make
make install
mv /usr/local/lib/wx*.dll /c/mingw/bin/

最佳答案

这似乎是一个定义

virtual void DoLog(wxLogLevel level, const char *szString, time_t t)
wxLog 的子类 ELJLog 中缺少

。添加以下界面不同的 DoLog 拷贝仅解决了问题:

virtual void DoLog(wxLogLevel level, const char *szString, time_t t)
{
wxString s(szString);
func (EiffelObject, (int)level, (void*)&s , (int)t);
}

关于c++ - 对 wxLog::DoLog 的 undefined reference 错误构建 wxHaskell 针对 wxWidget 3.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22187103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com