[求助] 编译 amule-dlp.antiLeech 报错

使用 openSUSE Tumbleweed
编译 aMule-DLP 及配套的 aMule-DLP.antiLeech
aMule-DLP 已经编译安装完成
但编译 aMule -DLP.antiLeech 时发生错误
典型的错误信息有以下两种



请教以下这是怎么回事,如何解决?
以前在 Fedora 下编译是没有一切顺利没有报错的。

粗看感觉像是缺少 header 或者 gcc 版本问题,请问您的 amule-dlp.antiLeech 是怎样编译的呀?我有空在 tw 上也试试看看能不能复现您的错误。

您的源码是来自 https://github.com/persmule/amule-dlp.antiLeech 吗?

谢谢
是的,是在 GitHub 这个项目上下载的

我在尝试了一下编译这个项目,折腾了一会能无报错编译 aMule-DLP.antiLeech 了

我所作的步骤如下:

错误分析

我能在我的 tw 上复现你的错误,根据你的截图我也安装了 wxWidgets-3_0-devel,根据报错是因为找不到对应的函数,而根据 aMule-DLP 的 README 所说:wxWidgets 版本须在 2.8.0 以上。
所以我去 wxwidgets 官网 发现 3.0 版本与 2.8 版本可能是不兼容的 (这点从 下载页面 可以看出,而且 2.8 版本不提供 rpm 安装包这也是为什么 opensuse 软件源没有 2.8 的 devel 包)。

安装合适的 wxGTK

我网上找了一圈没有发现合适 wxGTK-2.8.12 的 rpm 安装包,所以只能自己编译了。

下载 wxGTK 源码

可以从 官网 下载,下载链接:https://github.com/wxWidgets/wxWidgets/releases/download/v2.8.12/wxGTK-2.8.12.tar.gz

cd ~/Downloads
wget https://github.com/wxWidgets/wxWidgets/releases/download/v2.8.12/wxGTK-2.8.12.tar.gz

编译安装 wxGTK

GCC 版本问题
tw 目前带的 gcc 默认是 gcc9,而 aMule 开发的时候测试用的是 GCC4,所以会出现-Wnarrowing错误
这是将 Warning 视作 Error,所以可以关闭,添加 Flag-Wno-narrowing即可

具体命令如下

 # 安装依赖
sudo zypper in -y gtk2-devel gcc gcc-c++
# 解压缩源码包
cd ~/Downloads
tar -xzf wxGTK-2.8.12.tar.gz
cd wxGTK-2.8.12

# 创建一个编译文件夹
mkdir gtkbuild && cd gtkbuild

# 编译
CXXFLAGS="-Wno-narrowing" ../configure --enable-unicode --enable-debug
make -j`nproc` # 并行编译
sudo make install
sudo ldconfig

# 测试一下
wx-config --cxxflags
# 我这的输出是 -I/usr/local/lib64/wx/include/gtk2-unicode-debug-2.8 -I/usr/local/include/wx-2.8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXDEBUG__ -D__WXGTK__ -pthread

安装 aMule-DLP.antiLeech

这个我看您已经编译过了,重新编译应该就行,记得先make distclean清理一下就好
为了完整性我就贴一下我的命令

cd ~/Downloads
wget https://github.com/persmule/amule-dlp.antiLeech/archive/v4405.tar.gz
tar -xzf v4405.tar.gz
cd amule-dlp.antiLeech-4405
./autogen.sh
../configure # 这里依旧会提示 wx/string.h 找不到但是却能编译成功
make -j`nproc`
sudo make install

我并没有安装和用过 aMule-DLP,所以不能保证真的安装成功了,但是之前的报错确实没有了。
您可以参考一下我的编译步骤,验证一下是否真正有效。

祝您身体健康:grin:

2赞

感谢大佬,我再试一下
到时候反馈结果

不过我看源里面 wxWidgets 的说明,不同版本不能共存
那就是先得卸载 3.0.4 版再安装 2.8 版吧?

我是卸载了的,不过编译安装的目录应该和 zypper 安装的不一样所以可以共存在文件系统里,你可以试试先不卸载 3.0 看看会发生啥:rofl:

两个都存在是 PATH 环境变量里先找到哪个用哪个,除非 Makefile 显式指定 wxWdigets 版本。/usr/include 和 /usr/local/include。

也可以用 export CLAGS+=“-I/usr/local/include” 这样子来解决,因为这个变量会被 Makefile 读,而且它默认是空的。

还有一种办法,就是把 wxGTK 2.8 下写的 antiLeech 代码移植到 wxWidgets。熟悉 C 的话工作量不是很大。

那我来试试这个方法

不过有点奇怪


从这个帖子来看,antiLeech 和 aMule-DLP 应该是已经迁移到 wxGTK3.0 了
而且 aMule-DLP 的安装指南里

给的也是安装 3.0
恐怕是不是 openSUSE 上的 3.0.4 的包有点问题?

感觉 dlp 是可以支持 3.0 的但是 antileech 可能不行?

应该不是
以前在 Fedora 上是编译完 aMule-DLP 接着就可以把 antiLeech 编译了,不需要任何修改
这两个项目是同一个人在维护,不至于分开

请问您是用的 fedora 哪个版本呀

Fedora 31 Workstation GNOME
使用
sudo dnf build-dep amule
安装的编译依赖

好的,我去搞个 fedora31 虚拟机试试

openSUSE TW 跟 Fedora 31 的 gcc 版本不一样啊……

CString 和 wchar_t* 在开启 unicode 支持的机器上是等价的。应该就是 gcc 版本的问题。fix 也好搞,代码里 cast 一下就好了。所以我说会 C 这个问题不难 :nerd_face:

这真麻烦你了

就是不会改啊:rofl:

女王说得对,我找资料的时候发现别的项目也有类似的问题 https://github.com/rdfhdt/hdt-cpp/issues/34

确实 cast 一下就不会有这个 warning,这个 warning 是 gcc 一会开成 error 一会不开 error,比如 GCC4.3 就是 warning 不视为 error 的:rofl:

我装了 fedora 31 workstation 然后更新了一下,运行sudo dnf build-dep amule会说有的软件包找不到,是不是我少添加了什么软件源呢?

BTW,fedora 现在的 gcc 是 9.2.1,和 TW 好像差的不太远的亚子:crazy_face:

_tcsicmp (a, b) 就是提示错误那个 1402 行,要求 a 必须是 const wchat_t* 类型,userhash 是 const CString 类型。做一下安全的强制类型转换就行:

把 userhash 换成 static_cast<const whar_t*>(userhash)。

我感觉这样就可以了

1赞