2

I'm new in zeromq. After install zeromq-4.1.3, I just run the "Hello World" example in C from "http://zguide.zeromq.org/page:all" in the following way:

  1. gcc -c hwclient.c

  2. g++ -o client hwclient.o -lzmq

But it appears many "undefined reference to": (I'm sorry that I don't have enough rep to upload a screenshot)

//usr/local/lib/libzmq.a(libzmq_la-pipe.o): In function zmq::mutex_t::try_lock()': /usr/software/zeromq-4.1.3/src/mutex.hpp:114: undefined reference topthread_mutex_trylock' //usr/local/lib/libzmq.a(libzmq_la-ctx.o): In function zmq::ctx_t::~ctx_t()': /usr/software/zeromq-4.1.3/src/ctx.cpp:117: undefined reference torandombytes_close' //usr/local/lib/libzmq.a(libzmq_la-thread.o): In function thread_routine': /usr/software/zeromq-4.1.3/src/thread.cpp:91: undefined reference topthread_sigmask' //usr/local/lib/libzmq.a(libzmq_la-thread.o): In function zmq::thread_t::start(void (*)(void*), void*)': /usr/software/zeromq-4.1.3/src/thread.cpp:105: undefined reference topthread_create' //usr/local/lib/libzmq.a(libzmq_la-thread.o): In function zmq::thread_t::stop()': /usr/software/zeromq-4.1.3/src/thread.cpp:111: undefined reference topthread_join' //usr/local/lib/libzmq.a(libzmq_la-zmq_utils.o): In function zmq_curve_keypair': /usr/software/zeromq-4.1.3/src/zmq_utils.cpp:202: undefined reference tocrypto_box_keypair' //usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In function zmq::curve_client_t::encode(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:151: undefined reference tocrypto_box_afternm' //usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In function zmq::curve_client_t::decode(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:214: undefined reference tocrypto_box_open_afternm' //usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In function zmq::curve_client_t::curve_client_t(zmq::options_t const&)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:61: undefined reference tosodium_init' /usr/software/zeromq-4.1.3/src/curve_client.cpp:65: undefined reference to crypto_box_keypair' //usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In functionzmq::curve_client_t::produce_hello(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:265: undefined reference to crypto_box' //usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In functionzmq::curve_client_t::process_welcome(unsigned char const*, unsigned long)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:310: undefined reference to crypto_box_open' /usr/software/zeromq-4.1.3/src/curve_client.cpp:320: undefined reference tocrypto_box_beforenm' //usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In function zmq::curve_client_t::produce_initiate(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:340: undefined reference torandombytes' /usr/software/zeromq-4.1.3/src/curve_client.cpp:344: undefined reference to crypto_box' /usr/software/zeromq-4.1.3/src/curve_client.cpp:380: undefined reference tocrypto_box' //usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In function zmq::curve_client_t::process_ready(unsigned char const*, unsigned long)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:424: undefined reference tocrypto_box_open_afternm' //usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In function zmq::curve_server_t::encode(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:157: undefined reference tocrypto_box_afternm' //usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In function zmq::curve_server_t::decode(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:223: undefined reference tocrypto_box_open_afternm' //usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In function zmq::curve_server_t::curve_server_t(zmq::session_base_t*, std::string const&, zmq::options_t const&)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:64: undefined reference tosodium_init' /usr/software/zeromq-4.1.3/src/curve_server.cpp:68: undefined reference to crypto_box_keypair' //usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In functionzmq::curve_server_t::process_hello(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:319: undefined reference to crypto_box_open' //usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In functionzmq::curve_server_t::produce_welcome(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:340: undefined reference to randombytes' /usr/software/zeromq-4.1.3/src/curve_server.cpp:350: undefined reference torandombytes' /usr/software/zeromq-4.1.3/src/curve_server.cpp:355: undefined reference to crypto_secretbox' /usr/software/zeromq-4.1.3/src/curve_server.cpp:365: undefined reference torandombytes' /usr/software/zeromq-4.1.3/src/curve_server.cpp:377: undefined reference to crypto_box' //usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In functionzmq::curve_server_t::produce_ready(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:547: undefined reference to crypto_box_afternm' //usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In functionzmq::curve_server_t::process_initiate(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:421: undefined reference to crypto_secretbox_open' /usr/software/zeromq-4.1.3/src/curve_server.cpp:454: undefined reference tocrypto_box_open' /usr/software/zeromq-4.1.3/src/curve_server.cpp:479: undefined reference to crypto_box_open' /usr/software/zeromq-4.1.3/src/curve_server.cpp:496: undefined reference tocrypto_box_beforenm' collect2: error: ld returned 1 exit status

I also use the method in "How to build a project (say zeromq) as static library and linked it into my project":

./configure --enable-static --disable-shared --prefix=/home/gsp/zeromqworkspace/test

g++ -o client hwclient.o /home/gsp/zeromqworkspace/test/libzmq.a

It turns out to be: "g++: error: /home/gsp/zeromqworkspace/test/libzmq.a: No such file or directory".

I don't know what to do. I looking forward to your answers. Thank you!

Community
  • 1
  • 1
gsp
  • 21
  • 2

4 Answers4

0

The pthread functions should be linked in by adding the -lpthread switch to the g++ statement.

If the new linker switch gives an error that the library is not found, try sudo apt-get install libpthread-stubs0-dev

Freek Wiekmeijer
  • 4,556
  • 30
  • 37
0

When I run: g++ -o client zmqclient.o -I/usr/local/include -L/usr/local/lib -lzmq -lpthread, the result changes to the following:

gsp@gsp-Lenovo:~/zeromqworkspace/test$ g++ -o client zmqclient.o -I/usr/local/include -L/usr/local/lib -lzmq -lpthread /usr/local/lib/libzmq.a(libzmq_la-ctx.o): In function zmq::ctx_t::~ctx_t()': /usr/software/zeromq-4.1.3/src/ctx.cpp:117: undefined reference torandombytes_close' /usr/local/lib/libzmq.a(libzmq_la-zmq_utils.o): In function zmq_curve_keypair': /usr/software/zeromq-4.1.3/src/zmq_utils.cpp:202: undefined reference tocrypto_box_keypair' /usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In function zmq::curve_client_t::encode(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:151: undefined reference tocrypto_box_afternm' /usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In function zmq::curve_client_t::decode(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:214: undefined reference tocrypto_box_open_afternm' /usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In function zmq::curve_client_t::curve_client_t(zmq::options_t const&)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:61: undefined reference tosodium_init' /usr/software/zeromq-4.1.3/src/curve_client.cpp:65: undefined reference to crypto_box_keypair' /usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In functionzmq::curve_client_t::produce_hello(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:265: undefined reference to crypto_box' /usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In functionzmq::curve_client_t::process_welcome(unsigned char const*, unsigned long)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:310: undefined reference to crypto_box_open' /usr/software/zeromq-4.1.3/src/curve_client.cpp:320: undefined reference tocrypto_box_beforenm' /usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In function zmq::curve_client_t::produce_initiate(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:340: undefined reference torandombytes' /usr/software/zeromq-4.1.3/src/curve_client.cpp:344: undefined reference to crypto_box' /usr/software/zeromq-4.1.3/src/curve_client.cpp:380: undefined reference tocrypto_box' /usr/local/lib/libzmq.a(libzmq_la-curve_client.o): In function zmq::curve_client_t::process_ready(unsigned char const*, unsigned long)': /usr/software/zeromq-4.1.3/src/curve_client.cpp:424: undefined reference tocrypto_box_open_afternm' /usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In function zmq::curve_server_t::encode(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:157: undefined reference tocrypto_box_afternm' /usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In function zmq::curve_server_t::decode(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:223: undefined reference tocrypto_box_open_afternm' /usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In function zmq::curve_server_t::curve_server_t(zmq::session_base_t*, std::string const&, zmq::options_t const&)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:64: undefined reference tosodium_init' /usr/software/zeromq-4.1.3/src/curve_server.cpp:68: undefined reference to crypto_box_keypair' /usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In functionzmq::curve_server_t::process_hello(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:319: undefined reference to crypto_box_open' /usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In functionzmq::curve_server_t::produce_welcome(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:340: undefined reference to randombytes' /usr/software/zeromq-4.1.3/src/curve_server.cpp:350: undefined reference torandombytes' /usr/software/zeromq-4.1.3/src/curve_server.cpp:355: undefined reference to crypto_secretbox' /usr/software/zeromq-4.1.3/src/curve_server.cpp:365: undefined reference torandombytes' /usr/software/zeromq-4.1.3/src/curve_server.cpp:377: undefined reference to crypto_box' /usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In functionzmq::curve_server_t::produce_ready(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:547: undefined reference to crypto_box_afternm' /usr/local/lib/libzmq.a(libzmq_la-curve_server.o): In functionzmq::curve_server_t::process_initiate(zmq::msg_t*)': /usr/software/zeromq-4.1.3/src/curve_server.cpp:421: undefined reference to crypto_secretbox_open' /usr/software/zeromq-4.1.3/src/curve_server.cpp:454: undefined reference tocrypto_box_open' /usr/software/zeromq-4.1.3/src/curve_server.cpp:479: undefined reference to crypto_box_open' /usr/software/zeromq-4.1.3/src/curve_server.cpp:496: undefined reference tocrypto_box_beforenm' collect2: error: ld returned 1 exit status

gsp
  • 21
  • 2
  • I think you are missing (libsodium) library. However I don't know how did you manage to install ZMQ in the first place. – Krystian Sakowski Aug 31 '15 at 13:50
  • I install ZMQ in the following way: firstly "sudo apt-get install libtool autoconf automake", then " tar -zxvf libsodium-1.0.3.tar.gz cd libsodium-1.0.3 sudo ./autogen.sh sudo ./configure && make check sudo make install sudo ldconfig cd .." and next "tar -zxvf zeromq-x.x.x.tar.gz   cd zeromq-2.1.7   ./configure   make   sudo make install" – gsp Sep 01 '15 at 01:20
0

The undefined reference to messages mean that one or more libraries are missing.

Based on all the references to cryptographic operations, it looks like lib sodium and maybe also pthread are missing. To confirm this, you could try adding a direct library reference to lib sodium with

-l/usr/local/lib/libsodium.a

and maybe also

-lpthread

of course change the path to wherever

libsodium.a

is actually installed.

Shawn Mehan
  • 4,513
  • 9
  • 31
  • 51
James
  • 1
  • 1
0

Remember to use the library in the program you are compiling with gcc etc.:

-lzmq -lsodioum

or "remember to add your extra flags ex. -g -O2 -w"

./configure TYPEFLAGS='-lzmq -lsodium'

if configure sets the settings, do only ./configure above;

make TYPEFLAGS='-lzmq -lsodium'

Where TYPEFLAGS can be CFLAGS, CXXFLAGS, LDFLAGS and so on.

Dealazer
  • 59
  • 4