轉自: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++呢?這個有待研究一下。