[dpdk-dev] g++: undefined reference to

Hamid Ramazani mrramazani at gmail.com
Fri Jan 3 11:48:37 CET 2014


Hey Stefan,
Thanks a lot for your answer. I followed your instructions, and have
following problem.
Also I'd like to mention that on my system:
echo $RTE_SDK
/home/hamid/dpdk/dpdk-1.5.1r1
and
echo $RTE_TARGET
x86_64-default-linuxapp-gcc


I get following error now:
########################################
/home/hamid/dpdk/dpdk-1.5.1r1/x86_64-default-linuxapp-gcc/lib/librte_eal.a(eal_timer.o):
In function `rte_eal_timer_init':
eal_timer.c:(.text+0x42c): undefined reference to `clock_gettime'
eal_timer.c:(.text+0x468): undefined reference to `clock_gettime'
/home/hamid/dpdk/dpdk-1.5.1r1/x86_64-default-linuxapp-gcc/lib/librte_eal.a(eal_common_nonpci_devs.o):(.data+0x8):
undefined reference to `rte_pmd_ring_init'
collect2: ld returned 1 exit status
make: *** [all] Error 1
########################################


my sample.cpp is like this:


########################################
#include <iostream>
#include <string>
extern "C"{
#include <rte_config.h>
#include <rte_eal.h>
}
#include <stdlib.h>

class Runner
{
    public:
        Runner(){};
        void run(int argc, char** argv)
        {
            std::cout << std::string("Calling rte_eal_init") << std::endl;
            rte_eal_init(argc, argv);
            std::cout << std::string("Called rte_eal_init - done
now!") << std::endl;
        };
};

int main(int argc, char** argv)
{
    Runner* runner = new Runner();
    runner->run(argc, argv);
    delete runner;
    exit(0);
}
########################################

and my Makefile is like this:
all:
	g++ -m64 -pthread  -march=native -DRTE_MACHINE_CPUFLAG_SSE
-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSSE3
-DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSSE3
 -I/home/hamid/dpdk/dpdk-1.5.1r1/examples/sample/build/include
-I/home/hamid/dpdk/dpdk-1.5.1r1/x86_64-default-linuxapp-gcc/include
-include /home/hamid/dpdk/dpdk-1.5.1r1/x86_64-default-linuxapp-gcc/include/rte_config.h
-O3 -W -Wall -Werror -Wmissing-declarations -Wpointer-arith
-Wcast-align -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef
-Wwrite-strings -Wl,-melf_x86_64 -Wl,-export-dynamic sample.cpp -o
sample -Wl,-L/home/hamid/dpdk/dpdk-1.5.1r1/examples/sample/build/lib
-Wl,-L/home/hamid/dpdk/dpdk-1.5.1r1/x86_64-default-linuxapp-gcc/lib
-Wl,-L/home/hamid/dpdk/dpdk-1.5.1r1/x86_64-default-linuxapp-gcc/lib
-Wl,-lrte_kni -Wl,-lrte_pmd_e1000 -Wl,-lrte_pmd_ixgbe -Wl,-lrte_mbuf
-Wl,-lrte_cmdline -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm
-Wl,--start-group -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool
-Wl,-lrte_ring -Wl,-lrte_eal -Wl,-ldl -Wl,--end-group

########################################

Your advice is much appreciated.
Thanks in advance.
--Hamid


On 1/3/14, Stefan Baranoff <sbaranoff at gmail.com> wrote:
> Hamid,
>
> I apologize for the earlier slight misdirection; I was on my phone and
> trying to respond from memory. The actual answer is really to use
> -lrte_static_library_name and not referencing the .o files. Sorry!!!
>
> To get this I ran 'make -n' on the 'Hello World' example app (careful,
> there's the gcc command and then another "&& echo " with the command again
> in there when you run make -n and you really only need the real gcc call,
> not the echo). Below is a sample g++ command that works for me just running
> against a quick C++ files that does an 'rte_eal_init()' so you may need to
> extend it to handle more complex cases.
>
> Note I've stripped out a few pieces that may actually matter and left in
> some don't but work for the moment for this (very) simple case. I don't
> claim to be a GCC guru so we may encounter random failures down the road
> with our approach and are ready to accept that risk until we can get
> someone to review the effect of the removed options. Please take the
> following commands with a grain of salt. The primary omissions are the
> -Wl,-Map and --cref along with stripping out a few warnings
> (-Wstrict-prototypes, -Wmissing-prototypes,
> -Wold-style-definition, -Wnested-externs).
>
> Please note that near the end but before the -Wl,-L options there is the
> reference to my main file "sample.cpp" and the '-o sample' option for my
> file 'sample.cpp' that you would replace - this could be broken out better
> and I'm sure the default Makefile syntax could be extended to support c++
> but I'll leave that to someone else who is better with Make/GCC to
> implement properly.
>
> all:
>   g++ -m64 -pthread  -march=native -DRTE_MACHINE_CPUFLAG_SSE
> -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSSE3
> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSSE3
> -I/data/home/sbaranoff/DPDKPlayground/dpdk-1.3.1r2/examples/helloworld/build/include
> -I/home/sbaranoff/DPDKPlayground/dpdk-1.3.1r2//x86_64-default-linuxapp-gcc/include
> -include
> /home/sbaranoff/DPDKPlayground/dpdk-1.3.1r2//x86_64-default-linuxapp-gcc/include/rte_config.h
> -O3 -W -Wall -Werror -Wmissing-declarations -Wpointer-arith -Wcast-align
> -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings
> -Wl,-melf_x86_64 -Wl,-export-dynamic sample.cpp -o sample
> -Wl,-L/data/home/sbaranoff/DPDKPlayground/dpdk-1.3.1r2/examples/helloworld/build/lib
> -Wl,-L/home/sbaranoff/DPDKPlayground/dpdk-1.3.1r2//x86_64-default-linuxapp-gcc/lib
> -Wl,-L/home/sbaranoff/DPDKPlayground/dpdk-1.3.1r2//x86_64-default-linuxapp-gcc/lib
> -Wl,-lrte_kni -Wl,-lrte_pmd_e1000 -Wl,-lrte_pmd_ixgbe -Wl,-lrte_mbuf
> -Wl,-lrte_cmdline -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm
> -Wl,--start-group -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool
> -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-ldl -Wl,--end-group
>
>
> This is probably complete overkill and should be tailored to your use case
> but it is heading in the right direction!
>
> Here's the C++ file I compiled with it (yes, I should use RAII and that
> stack and not 'new' -- I know, Java habits die hard):
> #include <iostream>
> #include <string>
> #include <rte_config.h>
> #include <rte_eal.h>
> #include <stdlib.h>
>
> class Runner
> {
>   public:
>     Runner(){};
>     void run(int argc, char** argv)
>     {
>       std::cout << std::string("Calling rte_eal_init") << std::endl;
>       rte_eal_init(argc, argv);
>       std::cout << std::string("Called rte_eal_init - done now!") <<
> std::endl;
>     };
> };
>
> int main(int argc, char** argv)
> {
>   Runner* runner = new Runner();
>   runner->run(argc, argv);
>   delete runner;
>   exit(0);
> }
>
>
> Thanks,
> Stefan
>
>
> On Thu, Jan 2, 2014 at 4:52 PM, Stefan Baranoff <sbaranoff at gmail.com>
> wrote:
>
>> Hamid,
>>
>> I have a c++ app that compiles but not with me right now. When I get home
>> I'll send you a sample makefile.
>>
>> Stefan
>>
>> Sent from my smart phone; people don't make typos, Swype does!
>> On Jan 2, 2014 11:40 AM, "Hamid Ramazani" <mrramazani at gmail.com> wrote:
>>
>>> Stefan,
>>>
>>> I did:
>>>
>>> find `pwd` | egrep "[ao]$" >> liblistWithDuplicates.txt
>>> then opened it and added \ to the end of each line and added those
>>> libraries to my g++ arguments in Makefile after helloClass.o
>>>
>>> Now, in output I get two types of errors:
>>> multiple definition of ....
>>> undefined reference to ...
>>>
>>> In order to remove duplicate object file names, I wrote a short python
>>> script which is attached,
>>> to create liblistNoDuplicates.txt,
>>> but still I get the same errors.
>>>
>>>
>>> I'd really appreciate your advice.
>>>
>>> All the Best,
>>> Hamid
>>>
>>>
>>> On 1/2/14, Stefan Baranoff <sbaranoff at gmail.com> wrote:
>>> > Hamid,
>>> >
>>> > I do not think your attachments made it through but it looks like you
>>> are
>>> > not linking the DPDK object files in this line:
>>> > g++ helloClass.o
>>> > -I/home/hamid/dpdk/dpdk-1.5.1r1/x86_64-default-linuxapp-gcc/include
>>> > -lstdc++
>>> >
>>> > There would need to be many more files beyond helloClass.o listed. Try
>>> > adding the relevant DPDK object files (I do not have the path off hand
>>> but
>>> > I believe they are in the "build" folder) and recompiling. The files
>>> > you
>>> > need to add are those built when your build DPDK itself.
>>> >
>>> > This is similar to missing -lpcap if compiling against libpcap but in
>>> this
>>> > case you need to link against object files, not a shared library.
>>> >
>>> > Good luck!
>>> > Stefan
>>> >
>>> > Sent from my smart phone; people don't make typos, Swype does!
>>> > On Jan 2, 2014 4:35 AM, "Hamid Ramazani" <mrramazani at gmail.com> wrote:
>>> >
>>> >> Hi,
>>> >>
>>> >> I wanted to write a simple program using class (object oriented).
>>> >> I've
>>> >> attached my helloClass.cpp and also Makefile. after runnig make I get
>>> >> below errors.
>>> >> I think:
>>> >> 1. it is the problem of using c code in c++
>>> >> 2. I've used extern "C" in helloClass.cpp
>>> >> 3. Should I recompile the DPDK from source with gcc -c argument for
>>> >> compatibility with g++?
>>> >>
>>> >> Thanks in advance.
>>> >>
>>> >> g++ -c  helloClass.cpp
>>> >> -I/home/hamid/dpdk/dpdk-1.5.1r1/x86_64-default-linuxapp-gcc/include
>>> >> g++ helloClass.o
>>> >> -I/home/hamid/dpdk/dpdk-1.5.1r1/x86_64-default-linuxapp-gcc/include
>>> >> -lstdc++
>>> >> helloClass.o: In function `rte_lcore_id':
>>> >> helloClass.cpp:(.text+0x7): undefined reference to
>>> `per_lcore__lcore_id'
>>> >> helloClass.o: In function `rte_get_master_lcore':
>>> >> helloClass.cpp:(.text+0x15): undefined reference to
>>> >> `rte_eal_get_configuration'
>>> >> helloClass.o: In function `rte_lcore_is_enabled':
>>> >> helloClass.cpp:(.text+0x2a): undefined reference to
>>> >> `rte_eal_get_configuration'
>>> >> helloClass.o: In function `HelloClass::HelloClass(int, char**)':
>>> >>
>>> helloClass.cpp:(.text._ZN10HelloClassC2EiPPc[_ZN10HelloClassC5EiPPc]+0x20):
>>> >> undefined reference to `rte_eal_init'
>>> >>
>>> helloClass.cpp:(.text._ZN10HelloClassC2EiPPc[_ZN10HelloClassC5EiPPc]+0x4b):
>>> >> undefined reference to `__rte_panic'
>>> >> helloClass.o: In function `HelloClass::run()':
>>> >> helloClass.cpp:(.text._ZN10HelloClass3runEv[HelloClass::run()]+0x3f):
>>> >> undefined reference to `rte_eal_remote_launch'
>>> >> helloClass.cpp:(.text._ZN10HelloClass3runEv[HelloClass::run()]+0x80):
>>> >> undefined reference to `rte_eal_mp_wait_lcore'
>>> >> collect2: ld returned 1 exit status
>>> >> make: *** [helloClass.o] Error 1
>>> >>
>>> >>
>>> >> All the Best,
>>> >> Hamid
>>> >>
>>> >
>>>
>>
>


More information about the dev mailing list