lwip and C++ compilation/linking issue
Stark, Josef
j.stark at tum.de
Mon Sep 1 16:53:38 CEST 2014
Hello,
I want to use TCP/IP (and therefore ankh and lwip) inside a C++ application. The unmodified lwip example (src/l4/pkg/ankh/examples/lwip) compiles fine (and also works without DHCP and with a little tweaking), but it is written and configured as C and not C++.
So if I change the filename of main.c to main.cc and the Makefile accordingly, unfortunately it doesn't compile. Following error:
----------------
... Compiling main.o
In file included from /home/josef/Desktop/l4re-snapshot-2014053111/obj/l4/x86/include/contrib/lwip/contrib/src/include/lwip/arch.h:46:0,
from /home/josef/Desktop/l4re-snapshot-2014053111/obj/l4/x86/include/contrib/lwip/contrib/src/include/lwip/debug.h:35,
from /home/josef/Desktop/l4re-snapshot-2014053111/obj/l4/x86/include/contrib/lwip/contrib/src/include/lwip/opt.h:46,
from /home/josef/Desktop/l4re-snapshot-2014053111/obj/l4/x86/include/contrib/lwip/contrib/src/include/lwip/tcpip.h:35,
from /home/josef/Desktop/l4re-snapshot-2014053111/obj/l4/x86/include/l4/ankh/lwip-ankh.h:3,
from /home/josef/Desktop/test/main.cc:10:
/home/josef/Desktop/l4re-snapshot-2014053111/obj/l4/x86/include/contrib/lwip/arch/cc.h:48:13: error: previous declaration of ‘int* __h_errno_location()’ with ‘C++’ linkage
extern int *__h_errno_location (void) __THROW __attribute__ ((__const__));
^
In file included from /home/josef/Desktop/test/main.cc:19:0:
/home/josef/Desktop/l4re-snapshot-2014053111/obj/l4/x86/include/uclibc/netdb.h:61:73: error: conflicts with new declaration with ‘C’ linkage
extern int *__h_errno_location (void) __THROW __attribute__ ((__const__));
^
make[1]: *** [main.o] Error 1
make: *** [/home/josef/Desktop/l4re-snapshot-2014053111/obj/l4/x86/ext-pkg/home/josef/Desktop/test/OBJ-x86_586-l4f] Error 2
-----------------
Alright, so I tried surrounding the offending include with 'extern "C" ' (as well as moving it above #include <l4/ankh/lwip-ankh.h> since this file also includes it):
extern "C" {
#include "arch/cc.h"
}
I think that it solved the problem, because the error went away, but another error appeared (see below), so I also tried doing the same only to the offending line inside arch/cc.h instead:
extern "C" {
extern int *__h_errno_location (void) __THROW __attribute__ ((__const__));
}
Both approaches led to the same linker error:
------------------
main.o: In function `main':
main.cc:(.text.startup+0x11c): undefined reference to `ankhif_init(netif*)'
make[1]: *** [test] Error 1
make: *** [/home/josef/Desktop/l4re-snapshot-2014053111/obj/l4/x86/ext-pkg/home/josef/Desktop/test/OBJ-x86_586-l4f] Error 2
------------------
This is the Makefile (only the line SRC_CC is different to the original example Makefile)
------------------
PKGDIR ?= .
L4DIR ?= $(PKGDIR)/../l4re-snapshot-2014053111/src/l4
TARGET = test
SRC_CC = main.cc
SYSTEMS = x86-l4f arm-l4f
REQUIRES_LIBS = lwip libc_be_socket_lwip liblwip_netif_ankh libc_support_misc
include $(L4DIR)/mk/prog.mk
------------------
Which library is missing here, or what else could be going wrong?
Cheers,
Josef
More information about the l4-hackers
mailing list