c++linkerld.sobgp

Undefined reference to `libbgp::BgpFsm::tick()'


I started working with c++ a few weeks ago, and I started a new project to start learning more. I'm encountering an issue with an external dependency. I'm trying to use a library called: libbgp, and I installed it base on their documentation. Here is my code: https://gist.github.com/amb1s1/9b2c72294da0ec9416810c8686d3adce

Error:

/usr/bin/ld: /tmp/ccsdO32O.o: in function `ticker(libbgp::BgpFsm&)':
ambgp.cpp:(.text+0xa7): undefined reference to `libbgp::BgpFsm::tick()'
collect2: error: ld returned 1 exit status

I'm not sure if there is anything else that I have to do after installing the lib for the library to be accessible in my source code.

Update

I ran it with the -lbgp flag and when running it, i get the following error:

g++ -lbgp ambgp.cpp -o ambgp

Error:

./ambgp: error while loading shared libraries: libbgp.so.0: cannot open shared object file: No such file or directory

My Lib:

ls -l /usr/local/lib/

-rw-r--r-- 1 root root  10875880 Jan 18 16:56 libbgp.a
-rwxr-xr-x 1 root root       924 Jan 18 16:56 libbgp.la
lrwxrwxrwx 1 root root        15 Jan 18 16:56 libbgp.so -> libbgp.so.0.0.0
lrwxrwxrwx 1 root root        15 Jan 18 16:56 libbgp.so.0 -> libbgp.so.0.0.0
-rwxr-xr-x 1 root root   4291128 Jan 18 16:56 libbgp.so.0.0.0
drwxrwsr-x 3 root staff     4096 Dec 16 19:27 python3.7
echo $LD_LIBRARY_PATH
:/usr/local/lib

Solution

  • Before running the executable, you have to tell it where to find the libgdp.so file, if it is not stored in a standard place such as /usr/lib or /lib. Following should help you:

    $ export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/local/lib"
    $ ./ambgp
    

    If you do not want to export the LD_LIBRARY_PATH each time you start the shell manually, add the line to your /home/<user>/.bashrc file. Additionally, i think the -lbgp flag should go after the source file in the compiler command (g++ ambgp.cpp -lbgp -o ambgp)

    TL;DR :
    ld states it cannot find libbgp.so.0, and you wrote in the comments that you found libbgp.so without a trailing .0. So, creating a symlink to the library could help too:

    $ sudo ln -s /usr/local/lib/libbgp.so /usr/local/lib/libbgp.so.0
    

    For linking, you need a library file without a trailing .0, but for loading, the library name must have a trailing .0.

    The last thing to try is to directly specify the library location to the linker with -Wl,-rpath=/usr/local/lib (as you worked out already !)