解決openwrt應用編譯依賴報錯


轉自:https://my.oschina.net/hevakelcj/blog/411944

解決方案一:在 Makefile 中添加 Package/cpp-demo/extra_provides 宏

注意:L184,是 $(Package/$(1)/extra_provides)。也就是說,我們可以在 package/cpp-demo/Makefile 文件中定義 Package/cpp-demo/extra_provides 宏來強制性地將那幾個庫加進去。比如:

define Package/cpp-demo/extra_provides
    echo "libstdc++.so.6"
    echo "libc.so.6"
    echo "libm.so.6"
endef

經過試驗,正確的寫法如下:

define Package/cpp-demo/extra_provides
    echo 'libstdc++.so.6'; \
    echo 'libm.so.6'; \
    echo 'libc.so.6';
endef

這樣寫果然湊效,再 make V=s,能夠打包成功。

但是,有點我們必須明確的是:在打包中生成的ipk文件里,是沒有libstdc++, libc, libm這3個庫的。如果所安裝的OpenWrt系統里也沒有這3個庫,那么我們安裝的應用程序是不能正常使用的。
相當於是在騙ipk工具,我們已具備了上面這3個庫文件。

 

比較穩妥的方法是采用方案二,如下:

 

解決方案二:在 Makefile 中的 Package/cpp-demo/install 宏中准備所需的庫文件

還有另一個方法,注意L176,$(call Package/$(1)/install, $$(IDIR_$(1))),這個就是引用了我們在Makefile里寫的 Package/cpp-demo/install 宏么?
我們可以在這個宏里,將它需要的幾個庫文件復制到 $(1) 對應的目錄下。

如下修改:

define Package/cpp-demo/install
    $(INSTALL_DIR) $(1)/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/cpp-demo $(1)/bin

    $(INSTALL_DIR) $(1)/usr/lib
    $(INSTALL_DATA) $(TOOLCHAIN_DIR)/lib/libstdc++.so.6 $(1)/usr/lib
    $(INSTALL_DATA) $(TOOLCHAIN_DIR)/lib/libm.so $(1)/usr/lib/libm.so.6
    $(INSTALL_DATA) $(TOOLCHAIN_DIR)/lib/libc.so $(1)/usr/lib/libc.so.6
endef

其中,INSTALL_DATA 與 TOOLCHAIN_DIR 這兩個變量在 rules.mk 文件中定義。
之所以選用 TOOLCHAIN_DIR,是因為libstdc++.so.6這個文件就在這個變量所對應的路徑下。不信,你可以用 find 命令查找一下。

好了,這樣再make V=s,就能正常打包了。

 

解決方案三:在 Makefile 文件的 Package/cpp-demo 宏中加 DEPENDS 描述

這個方法不是我想到的,是[GunNRose]給我建議。修改 Makefile:

define Package/cpp-demo
    ...<略>
    DEPENDS:+=libstdcpp
endef

經博主親自嘗試,是OK的。

不過,為什么是叫libstdcpp而不是libstdc++呢?這個有待研究一下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM