OpenWrt Forum Archive

Topic: Can't get my helloworld to compile with uClibc++

The content of this topic has been archived on 3 May 2018. There are no obvious gaps in this topic, but there may still be some posts missing at the end.

I've been following the following (old) tutorial (http://web.archive.org/web/200712100428 … mming.html) to create a helloworld program in C++. I want to write something a lot bigger but obiously first I need to get this working. And for the project I want to make I would really like to be able to use C++ and uClibc++.

I downloaded the kamikaze 8.09.1 source and build the SDK as described in part 3 of the tutorial. This all works perfectly and I have a plain C version of helloworld working.

The problem is that I followed part 2 of the tutorial to upgrade to C++ and link against uClibc++. In the white russian release (which I accidental used before) this worked perfectly. In the kamikaze release however the build fails with the following messages:

helloworld.cpp:4:20: error: iostream: No such file or directory
helloworld.cpp:5:18: error: string: No such file or directory

Of course I tried to incorporate part of the uClibc++ sample file from this tutorial (http://nuwiki.openwrt.org/oldwiki/Build … .linkables). These however rely on include directories under the $(BUILDIR) which are not present in the 8.09.1 version. When creating a symlink to their actual location all hell breaks loose when compiling.

I hope any of you can give me some advice on fixing my problem, a working Makefile or point me to a tuturial that actually works with the SDK of version 8.09.1. Anything will be greatly appreciated! I've been struggling with this problem for days now so I'm at the point of pulling my hair out sad

This is my Project Makefile

##############################################
# OpenWrt Makefile for helloworld program
#
#
# Most of the variables used here are defined in
# the include directives below. We just need to
# specify a basic description of the package,
# where to build our program, where to find
# the source files, and where to install the
# compiled program on the router.
#
# Be very careful of spacing in this file.
# Indents should be tabs, not spaces, and
# there should be no trailing whitespace in
# lines that are not commented.
#
##############################################

include $(TOPDIR)/rules.mk

# Name and release number of this package
PKG_NAME:=helloworld
PKG_RELEASE:=1

# This specifies the directory where we're going to build the program.
# The root build directory, $(BUILD_DIR), is by default the build_mipsel
# directory in your OpenWrt SDK directory
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

# Specify package information for this program.
# The variables defined here should be self explanatory.
define Package/helloworld
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=helloworld -- prints a snarky message
endef

define Package/helloworld/description
    If you can't figure out what this program does,
    you're probably brain-dead and need immediate
    medical attention.
endef

define Package/helloworld/conffiles
endef

# Specify what needs to be done to prepare for building the package.
# In our case, we need to copy the source files to the build directory.
# This is NOT the default.  The default uses the PKG_SOURCE_URL and the
# PKG_SOURCE which is not defined here to download the source from the web.
# In order to just build a simple program that we have just written, it is
# much easier to do it this way.
define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

#########################################################################################
# The Build/Compile directive needs to be specified in order to customize compilation
# and linking of our program.  We need to link to uClibc++ and to specify that we
# do NOT want to link to the standard template library.
#
# To do this we define the LIBS variable.  To prevent linking to the standard libraries we
# add "-nodefaultlibs" to the $(LIBS) variable and then specify "-lgcc -lc" to ensure that
# there are no unresolved references to internal GCC library subroutines. Finally
# "-luClibc++" to link to the  uClibc++ library.  Also, we need to specify "-nostdinc++"
# in the compiler flags to tell the compiler that c++ standard template library functions
# and data structures will be linked to in specified external libraries and not the
# standard libraries.
#########################################################################################
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

# Specify where and how to install the program. Since we only have one file,
# the helloworld executable, install it by copying it to the /bin directory on
# the router. The $(1) variable represents the root directory on the router running
# OpenWrt. The $(INSTALL_DIR) variable contains a command to prepare the install
# directory if it does not already exist.  Likewise $(INSTALL_BIN) contains the
# command to copy the binary file from its current location (in our case the build
# directory) to the install directory.
define Package/helloworld/install
    $(INSTALL_DIR) $(1)/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
endef

#define Build/InstallDev
#endif

# This line executes the necessary commands to compile our program.
# The above define directives specify all the information needed, but this
# line calls BuildPackage which in turn actually uses this information to
# build a package.
$(eval $(call BuildPackage,helloworld))

And this is the Makefile for compiling the program:

# Make file
helloworld: helloworld.o
    $(CXX) $(LDFLAGS) helloworld.o -o helloworld $(LIBS)

helloworld.o: helloworld.cpp
    $(CXX) $(CXXFLAGS) -c helloworld.cpp

clean:
    rm *.o helloworld

And finally my implementation file:

/****************
* Helloworld.cpp
*****************/
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s = "Hell! O' world, why won't my c++ code run?\n\n";
    cout << s;
    return 0;
}
hokitoki wrote:
#include <iostream>
#include <string>

Have you tried this?

#include <iostream.h>
#include <string.h>

~ JoW

The discussion might have continued from here.