KyleRicardo / MentoHUST-OpenWrt-ipk

MentoHUST-OpenWrt-ipk包
284 stars 78 forks source link

make时找不到libpcap.a? #2

Open JosephRowing opened 5 years ago

JosephRowing commented 5 years ago

我用SDK直接编译,在make packages/mentohust/compile V=s时出错,提示 mipsel-openwrt-linux-musl-gcc: error: /mnt/linux/openwrt-sdk-18.06.1-ramips-mt7621_gcc-7.3.0_musl.Linux-x86_64/build_dir/target-mipsel_24kc_musl/libpcap-*/ipkg-install/usr/lib/libpcap.a: No such file or directory 请问这个要怎么解决?

KyleRicardo commented 5 years ago

这个是因为你直接下的SDK并没有完整的Tool和Toolchain编译环境。一定要按照我的README的方法进行编译。先Git clone官方的SDK,然后编译Tool和Toolchain,最后再编译mentohust。这样在编译mentohust的时候,会自动把依赖的libpcap给编译出来,你直接用下载的sdk包,是找不到libpcap依赖的。

JosephRowing commented 5 years ago

已解决,感谢!问大神一个问题:如果想要用SDK直接编译的话,SDK目录下没有tool文件,没办法编译Tool和Toolchain,这样应该怎么办?

KyleRicardo commented 5 years ago

你需要从官方下载Toolchain包,但是强烈不建议这么做。我当时也是这种想法,手动下载SDK及Toolchain进行编译,弄了不知道多久都没成功过,总是缺胳膊少腿。直接用clone的仓库来折腾是最好的选择。而且中途需要下载的dl文件夹我也在百度云分享了,最近还更新了一波,很快的。经验之谈,只是让后面的人少走点弯路。

qiang-yu commented 4 years ago

直接下载官方 SDK,然后编译是可以的, 用官方的 SDK编译,你会遇到找不到 libpcap.a 文件 这是因为,官方的 SDK 默认只编译出来 libpcap.so ,没有把 libpcap.a 编译出来

./script/feeds update -a ./script/feeds install libpcap

到 package/feeds/base/libpcap 目录下面,找到 Makefile ,你会看到下面的内容

define Build/InstallDev
$(INSTALL_DIR) $(1)/usr/include
$(CP) $(PKG_INSTALL_DIR)/usr/include/pcap* $(1)/usr/include/

    $(INSTALL_DIR) $(1)/usr/lib                                   
    $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcap.{a,so*} $(1)/usr/lib/

endef

define Package/libpcap/install
$(INSTALL_DIR) $(1)/usr/lib
$(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcap.so* $(1)/usr/lib/ endef

$(eval $(call BuildPackage,libpcap))

默认,只编译 libpcap.so ,所以你找不到 libpcap.a, 修改这个 Makefile ,改成下面这样

define Package/libpcap/install
$(INSTALL_DIR) $(1)/usr/include $(CP) $(PKG_INSTALL_DIR)/usr/include/pcap* $(1)/usr/include/

    $(INSTALL_DIR) $(1)/usr/lib
    $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcap.{a,so*} $(1)/usr/lib/

endef

$(eval $(call BuildPackage,libpcap))

然后你再编译,就会出来 libpcap.a 文件了

当然,这么多年过去了, openwrt 的编译系统发生了很大的变化, 你还会遇到一些 目录名 其实已经改名字了,以至于你找不到东西的问题, 方法一样, 改了名字的目录,你找到新名字,然后修改对应的 Makefile 文件就可以了

下载官方 SDK 最大的好处就是,编译很快, 为了编译一个 mentohust 而去编译整个 toolchain 代价太大了,还是建议直接用官方的 SDK 编译来的快

qiang-yu commented 4 years ago

这里是需要修改的编译选项

编译选项

下面是编译出来的结果

编译结果

附赠几个我自己编译好的东西,我是为 DW33D 路由器编译的,不知道对你们有没有用 Desktop.zip

KyleRicardo commented 4 years ago

不知不觉离当初折腾这玩意儿已经过了4年有余了,当时的编译方法现在落后了也是意料之中。Thanks for sharing!

smallerxie commented 4 years ago

@qiang-yu 大神们好,本人交叉编译小白,遇到了本issue中的问题。我理解的前述解决方法:

  1. 把./package/feeds/base/libpcap/Makefile 中 define Package/libpcap/install 一节的内容完全用 define Package/Install 的内容替换掉,而 Build/InstallDev 按原样保留(我把我把修改后的Makefile.txt上传了以免表达不清);
  2. “然后再编译”,是指make packages/mentohust/compile V=s么?

现象: 我执行上述操作仍然提示找不到 libpcap.a; 我于是make clean & make dirclean; 并且./scripts/feeds update & install 之后,再make packages/mentohust/compile V=s,错误反而成了: make[2]: Entering directory '/package/toolchain' rm -rf /build_dir/target-mips_24kc_musl/toolchain/.pkgdir/libc.installed /build_dir/target-mips_24kc_musl/toolchain/.pkgdir/libc mkdir -p /build_dir/target-mips_24kc_musl/toolchain/.pkgdir/libc install -d -m0755 /build_dir/target-mips_24kc_musl/toolchain/.pkgdir/libc/lib /build_dir/target-mips_24kc_musl/toolchain/.pkgdir/libc/usr/bin cp -fpR /staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl/lib/ld-musl-.so /build_dir/target-mips_24kc_musl/toolchain/.pkgdir/libc/lib/ cp: cannot stat '/staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl/lib/ld-musl-.so': No such file or directory 我看了下,我的/staging_dir/下面就没有生成 ,/toolchain-mips_24kc_gcc-7.3.0_musl/这个目录……

KyleRicardo commented 4 years ago

你完全理解错了。qiang-yu大佬的意思是,在#define Package/libpcap/install这一节下面,把libpcap.so*改为libpcap.{a,so*}。这样可以把libpcap.a文件也复制到相应位置。而不是说用某一段内容替换这段内容。 另外,你的路由器是什么牌子什么型号?我中午可以帮你研究一下。

smallerxie commented 4 years ago

多谢 @KyleRicardo 大佬! 我最开始就先试了下你说的意思,是下面这个意思吧? define Package/libpcap/install $(INSTALL_DIR) $(1)/usr/lib # $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcap.so. $(1)/usr/lib/ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcap.{a,so} $(1)/usr/lib/ endef 然后还是提示找不到libpcap.a文件才开始瞎琢磨的。。。 我想问下 qiang-yu 大佬的编译出libpcap.a的结果是执行什么编译命令得到的?

路由器是Netgear WNDR3700v2 (WNDR3800),我是先试了试用release版本的SDK没搞定,然后就用你readme中的方法编译了整个tool和toolchain得到了ipk了,就是为了一个依赖这么折腾不太甘心,也想学习提高下,就又和SDK下编译耗上了……

另外你的方法git clone过来的总是trunk版的repo把,会不会编译出来的ipk在低版本OpenWrt有可能不能用(mentohust应该没问题,如果是其他依赖更多的ipk)。

milkybird98 commented 4 years ago

@smallerxie 没有找到libpcap.a文件是因为新的openwrt sdk启用了自动清理,在输出ipk文件后就会删除build过程中的临时文件,此步骤会清空 build_dir/target-<arch>/<package>/ 目录下的文件 而mentohust编译需要用到build过程中产生的 build_dir/target-<arch>/libpcap-*/ipkg-install/usr/lib/libpcap.a 文件,自然是无法找到的

关闭 menuconfig -> Advanced configuration options (for developers) -> Automatic removal of build directories 功能即可正常编译

KyleRicardo commented 2 years ago

最近发现当时对于Makefile的理解还不够到位,试了下我的新版Makefile,不需要对其他文件或设置做任何修改,即将发布一个新版本。 另外,教程应该也会更新一版最新的。 感谢各位大佬指点。