Open JosephRowing opened 5 years ago
这个是因为你直接下的SDK并没有完整的Tool和Toolchain编译环境。一定要按照我的README的方法进行编译。先Git clone官方的SDK,然后编译Tool和Toolchain,最后再编译mentohust。这样在编译mentohust的时候,会自动把依赖的libpcap给编译出来,你直接用下载的sdk包,是找不到libpcap依赖的。
已解决,感谢!问大神一个问题:如果想要用SDK直接编译的话,SDK目录下没有tool文件,没办法编译Tool和Toolchain,这样应该怎么办?
你需要从官方下载Toolchain包,但是强烈不建议这么做。我当时也是这种想法,手动下载SDK及Toolchain进行编译,弄了不知道多久都没成功过,总是缺胳膊少腿。直接用clone的仓库来折腾是最好的选择。而且中途需要下载的dl文件夹我也在百度云分享了,最近还更新了一波,很快的。经验之谈,只是让后面的人少走点弯路。
直接下载官方 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 编译来的快
不知不觉离当初折腾这玩意儿已经过了4年有余了,当时的编译方法现在落后了也是意料之中。Thanks for sharing!
@qiang-yu 大神们好,本人交叉编译小白,遇到了本issue中的问题。我理解的前述解决方法:
现象: 我执行上述操作仍然提示找不到 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/这个目录……
你完全理解错了。qiang-yu大佬的意思是,在#define Package/libpcap/install这一节下面,把libpcap.so*
改为libpcap.{a,so*}
。这样可以把libpcap.a文件也复制到相应位置。而不是说用某一段内容替换这段内容。
另外,你的路由器是什么牌子什么型号?我中午可以帮你研究一下。
多谢 @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)。
@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
功能即可正常编译
最近发现当时对于Makefile的理解还不够到位,试了下我的新版Makefile,不需要对其他文件或设置做任何修改,即将发布一个新版本。 另外,教程应该也会更新一版最新的。 感谢各位大佬指点。
我用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 请问这个要怎么解决?