DPDK patches and discussions
 help / color / mirror / Atom feed
From: Stefan Baranoff <sbaranoff@gmail.com>
To: Hamid Ramazani <mrramazani@gmail.com>
Cc: dev@dpdk.org
Subject: Re: [dpdk-dev] g++: undefined reference to
Date: Thu, 2 Jan 2014 19:46:01 -0500	[thread overview]
Message-ID: <CAHzKxpYo6NTrKeEJEmP=3Aqu=gWZY-cyHAByvd-49AdZuZ1FOg@mail.gmail.com> (raw)
In-Reply-To: <CAHzKxpZ0c8ryHxh3Nh-PEckKZD8a9XiYGy09ucgv4QjrFBPGbg@mail.gmail.com>

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@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@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@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@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
>> >>
>> >
>>
>

  parent reply	other threads:[~2014-01-03  0:44 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-02  9:35 Hamid Ramazani
2014-01-02 13:19 ` Stefan Baranoff
2014-01-02 16:40   ` Hamid Ramazani
     [not found]     ` <CAHzKxpZ0c8ryHxh3Nh-PEckKZD8a9XiYGy09ucgv4QjrFBPGbg@mail.gmail.com>
2014-01-03  0:46       ` Stefan Baranoff [this message]
2014-01-03 10:48         ` Hamid Ramazani
2014-01-03 11:07           ` Thomas Monjalon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAHzKxpYo6NTrKeEJEmP=3Aqu=gWZY-cyHAByvd-49AdZuZ1FOg@mail.gmail.com' \
    --to=sbaranoff@gmail.com \
    --cc=dev@dpdk.org \
    --cc=mrramazani@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).