Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

make时找不到libpcap.a? #2

Open
JosephRowing opened this issue Jan 1, 2019 · 11 comments
Open

make时找不到libpcap.a? #2

JosephRowing opened this issue Jan 1, 2019 · 11 comments
Assignees
Labels

Comments

@JosephRowing
Copy link

我用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
Copy link
Owner

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

@JosephRowing
Copy link
Author

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

@KyleRicardo
Copy link
Owner

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

@KyleRicardo KyleRicardo self-assigned this Jan 3, 2019
@qiang-yu
Copy link

qiang-yu commented Oct 5, 2019

直接下载官方 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
Copy link

qiang-yu commented Oct 5, 2019

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

编译选项

下面是编译出来的结果

编译结果

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

@KyleRicardo
Copy link
Owner

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

@smallerxie
Copy link

smallerxie commented Apr 24, 2020

@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
Copy link
Owner

KyleRicardo commented Apr 24, 2020

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

@smallerxie
Copy link

smallerxie commented Apr 24, 2020

多谢 @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
Copy link

@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
Copy link
Owner

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants