-1

I'm trying to compile simple helloworld program for OpenWrt (using build system, branch 17.01.6). I used two tutorials: helloworld tutorial on official site and by Eric Bishop, part 2 for C++.

But during compiling helloworld-package I got error: Package helloworld is missing dependencies for the following libraries: libc.so.6

Structure of files:
.
├--openwrt_17_01
    ├--source #source directory, build system
    ├--helloworld #helloworld project
     |   └--src
     |      ├--helloworld.cpp
     |      └--Makefile #C++ project makefile
    └--mypackages
       └--examples
          └--helloworld
             └--Makefile #package makefile

openwrt_17_01/helloworld/src/helloworld.cpp:

#include "stdio.h"
int main()
{
    printf("Hello, world! (C++)\n\n");
    return 0;
}

openwrt_17_01/helloworld/src/Makefile:

helloworld: helloworld.o
    $(CXX) $(LDFLAGS) helloworld.o -o helloworld $(LIBS)
helloworld.o: helloworld.cpp
    $(CXX) $(CXXFLAGS) -c helloworld.cpp
clean:
    rm *.o helloworld

mypackages/examples/helloworld/Makefile:

include $(TOPDIR)/rules.mk

PKG_NAME:=helloworld
PKG_VERSION:=1.0
PKG_RELEASE:=1

SOURCE_DIR:=/home/mzhi/proj_src/openwrt_17_01/helloworld
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/helloworld
    SECTION:=examples
    DEPENDS:= +libstdcpp +libc
    CATEGORY:=Examples
    TITLE:=Hello, World!
endef

define Package/helloworld/description
    A simple "Hello, world!" -application.
endef

define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) $(SOURCE_DIR)/src/* $(PKG_BUILD_DIR)/
endef

define Build/Compile
    $(MAKE) -C $(PKG_BUILD_DIR) \
    LIBS="-nodefaultlibs -lgcc -lc -luClibc++" \
    LDFLAGS="$(EXTRA_LDFLAGS)" \
    CXXFLAGS="$(TARGET_CFLAGS) $(EXTRA_CPPFLAGS) -nostdinc++" \
    $(TARGET_CONFIGURE_OPTS) \
    CROSS="$(TARGET_CROSS)" \
    ARCH="$(ARCH)" \
    $(1);
endef

define Package/helloworld/install
    $(INSTALL_DIR) $(1)/usr/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/usr/bin
endef

$(eval $(call BuildPackage,helloworld))

Full output of compilation (make package/helloworld/compile -j1 V=s):

make[1]: Entering directory 
'/home/mzhi/proj_src/openwrt_17_01/openwrt'
make[2]: Entering directory 
'/home/mzhi/proj_src/openwrt_17_01/openwrt/package/libs/toolchain'
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target- mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
echo "libc" >> 
/home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
echo "libgcc" >> 
/home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
echo "libstdcpp" >> 
/home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
echo "libpthread" >> 
/home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
echo "librt" >> 
/home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
if [ -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean ]; then rm -f /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo/toolchain.default.install.clean; fi
make[2]: Leaving directory '/home/mzhi/proj_src/openwrt_17_01/openwrt/package/libs/toolchain'
make[2]: Entering directory '/home/mzhi/proj_src/openwrt_17_01/mypackages/examples/helloworld'
mkdir -p /home/mzhi/proj_src/openwrt_17_01/openwrt/bin/targets/ramips/mt7621/packages /home/mzhi/proj_src/openwrt_17_01/openwrt/build_dir/target-mipsel_24kc_musl-1.1.16/helloworld/ipkg-mipsel_24kc/helloworld/CONTROL /home/mzhi/proj_src/openwrt_17_01/openwrt/staging_dir/target-mipsel_24kc_musl-1.1.16/pkginfo
install -d -m0755 /home/mzhi/proj_src/openwrt_17_01/openwrt/build_dir/target-mipsel_24kc_musl-1.1.16/helloworld/ipkg-mipsel_24kc/helloworld/usr/bin
install -m0755 /home/mzhi/proj_src/openwrt_17_01/openwrt/build_dir/target-mipsel_24kc_musl-1.1.16/helloworld/helloworld /home/mzhi/proj_src/openwrt_17_01/openwrt/build_dir/target-mipsel_24kc_musl-1.1.16/helloworld/ipkg-mipsel_24kc/helloworld/usr/bin
find /home/mzhi/proj_src/openwrt_17_01/openwrt/build_dir/target-mipsel_24kc_musl-1.1.16/helloworld/ipkg-mipsel_24kc/helloworld -name 'CVS' -o -name '.svn' -o -name '.#*' -o -name '*~'| xargs -r rm -rf
Package helloworld is missing dependencies for the following libraries:
libc.so.6
Makefile:65: recipe for target '/home/mzhi/proj_src/openwrt_17_01/openwrt/bin/packages/mipsel_24kc/mypackages/helloworld_1.0-1_mipsel_24kc.ipk' failed
make[2]: *** [/home/mzhi/proj_src/openwrt_17_01/openwrt/bin/packages/mipsel_24kc/mypackages/helloworld_1.0-1_mipsel_24kc.ipk] Error 1
make[2]: Leaving directory '/home/mzhi/proj_src/openwrt_17_01/mypackages/examples/helloworld'
package/Makefile:105: recipe for target 'package/feeds/mypackages/helloworld/compile' failed
make[1]: *** [package/feeds/mypackages/helloworld/compile] Error 2
make[1]: Leaving directory '/home/mzhi/proj_src/openwrt_17_01/openwrt'
/home/mzhi/proj_src/openwrt_17_01/openwrt/include/toplevel.mk:205: recipe for target 'package/helloworld/compile' failed
make: *** [package/helloworld/compile] Error 2

operating system: ubuntu 16.04
Target System: Mediatek Ralink MIPS
Subtarget: MT7621 based boards
Target Profile: Ubiquiti EdgeRouter X

Googled a lot, but I still can not understand why the compiler does not see the necessary library libc.so.6 and how to connect it correctly in the Makefile

Maybe someone has already faced similar problems, please share the solution.

MZhidenko
  • 1
  • 2
  • Do you have your code compiled inside the folder `openwrt_17_01/helloworld/src/`? If you have, try a `make clean` in that folder and launch the process again. – Bernat Pedrol Vozmediano Mar 12 '19 at 14:34
  • @BernatPedrolVozmediano Yes, code successfully compiled inside `openwrt_17_01/helloworld/src/` And yes, I did `make clean` after that – MZhidenko Mar 12 '19 at 14:41
  • Maybe, this is a more global problem. Before that, I tried to compile a program using `iostream`, and the compiler cursed this directive, then I removed this code and made the simplest example without `iostream`, but now this error appears – MZhidenko Mar 12 '19 at 14:45

2 Answers2

0

What about changing your Makefile to this one?

BINARY  = helloworld$(EXE)

FILES   = helloworld.o

all: $(BINARY)

helloworld$(EXE): $(FILES)
    $(CC) $(FILES) -o $(@)

clean:
    rm -f $(FILES) *.o

And the code to this one:

#include <stdio.h>
int main()
{
    printf("Hello, world! (C++)\n\n");
    return 0;
}
  • Thank you for your version. I tried it, and `make` inside `openwrt_17_01/helloworld/src/` works (as well as the previous one works), but the same error still occurs when I run `make package/helloworld/compile -j1 V=s` inside `openwrt_17_01/source` directory. Also, I want exactly C++ compiler, not C, because in the future I plan to write programs and compile the packages for openwrt on the C++ – MZhidenko Mar 13 '19 at 10:02
0

The answer you want is here: https://fleshandmachines.wordpress.com/2011/08/22/openwrt-cc-programing/

You must change $(CC) for $(CXX) and $(CFLAGS) for $(CXXFLAGS)

J. Murray
  • 1,460
  • 11
  • 19
ENHering
  • 55
  • 6