nats-io / nats.c

A C client for NATS
Apache License 2.0
384 stars 134 forks source link

undefined reference to `pthread_mutexattr_init' #709

Closed jlevon closed 8 months ago

jlevon commented 8 months ago

Observed behavior

When building the cmake project via meson, the library is linked without pthreads, leading to a build error.

I believe the problem is that NATS_USE_PTHREAD is set only on CMAKE_C_FLAGS, but those flags do not necessarily apply to the link stage.

Expected behavior

It should still build. This diff helps:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index eada3dc..ffd1666 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -178,6 +178,7 @@ if(UNIX)
     set(NATS_OS "LINUX")
     set(NATS_USE_PTHREAD "-pthread")
     set(NATS_EXTRA_LIB "rt")
+    set(NATS_EXTRA_LIB "pthread")
   endif(APPLE)
   if (${NATS_BUILD_ARCH} MATCHES "32")
     if(NOT APPLE)

But I'm not 100% sure it's correct in general.

Server and client version

nats.c as of fab89f491cc991b046b04811024d46705f08d158

Host environment

centos 8 x86-64 as per the below repo

Steps to reproduce

To reproduce, clone https://github.com/jlevon/nats-build-error and run make (requires docker).

FAILED: subprojects/nats.c/libcm_nats.so 
cc  -o subprojects/nats.c/libcm_nats.so subprojects/nats.c/libcm_nats.so.p/src_asynccb.c.o subprojects/nats.c/libcm_nats.so.p/src_buf.c.o subprojects/nats.c/libcm_nats.so.p/src_comsock.c.o subprojects/nats.c/libcm_nats.so.p/src_conn.c.o subprojects/nats.c/libcm_nats.so.p/src_crypto.c.o subprojects/nats.c/libcm_nats.so.p/src_hash.c.o subprojects/nats.c/libcm_nats.so.p/src_js.c.o subprojects/nats.c/libcm_nats.so.p/src_jsm.c.o subprojects/nats.c/libcm_nats.so.p/src_kv.c.o subprojects/nats.c/libcm_nats.so.p/src_micro.c.o subprojects/nats.c/libcm_nats.so.p/src_micro_args.c.o subprojects/nats.c/libcm_nats.so.p/src_micro_client.c.o subprojects/nats.c/libcm_nats.so.p/src_micro_endpoint.c.o subprojects/nats.c/libcm_nats.so.p/src_micro_error.c.o subprojects/nats.c/libcm_nats.so.p/src_micro_monitoring.c.o subprojects/nats.c/libcm_nats.so.p/src_micro_request.c.o subprojects/nats.c/libcm_nats.so.p/src_msg.c.o subprojects/nats.c/libcm_nats.so.p/src_nats.c.o subprojects/nats.c/libcm_nats.so.p/src_natstime.c.o subprojects/nats.c/libcm_nats.so.p/src_nkeys.c.o subprojects/nats.c/libcm_nats.so.p/src_nuid.c.o subprojects/nats.c/libcm_nats.so.p/src_opts.c.o subprojects/nats.c/libcm_nats.so.p/src_parser.c.o subprojects/nats.c/libcm_nats.so.p/src_pub.c.o subprojects/nats.c/libcm_nats.so.p/src_srvpool.c.o subprojects/nats.c/libcm_nats.so.p/src_stats.c.o subprojects/nats.c/libcm_nats.so.p/src_status.c.o subprojects/nats.c/libcm_nats.so.p/src_sub.c.o subprojects/nats.c/libcm_nats.so.p/src_timer.c.o subprojects/nats.c/libcm_nats.so.p/src_url.c.o subprojects/nats.c/libcm_nats.so.p/src_util.c.o subprojects/nats.c/libcm_nats.so.p/src_unix_cond.c.o subprojects/nats.c/libcm_nats.so.p/src_unix_mutex.c.o subprojects/nats.c/libcm_nats.so.p/src_unix_sock.c.o subprojects/nats.c/libcm_nats.so.p/src_unix_thread.c.o subprojects/nats.c/libcm_nats.so.p/src_stan_conn.c.o subprojects/nats.c/libcm_nats.so.p/src_stan_copts.c.o subprojects/nats.c/libcm_nats.so.p/src_stan_msg.c.o subprojects/nats.c/libcm_nats.so.p/src_stan_protocol.pb-c.c.o subprojects/nats.c/libcm_nats.so.p/src_stan_pub.c.o subprojects/nats.c/libcm_nats.so.p/src_stan_sopts.c.o subprojects/nats.c/libcm_nats.so.p/src_stan_sub.c.o -Wl,--as-needed -Wl,--no-undefined -shared -fPIC -Wl,--start-group -Wl,-soname,libcm_nats.so /usr/lib64/libssl.so /usr/lib64/libcrypto.so -lrt /usr/lib64/libprotobuf-c.so -Wl,--end-group
subprojects/nats.c/libcm_nats.so.p/src_unix_mutex.c.o: In function `natsMutex_Create':
/nats-build-error/build/../subprojects/nats.c/src/unix/mutex.c:27: undefined reference to `pthread_mutexattr_init'
/nats-build-error/build/../subprojects/nats.c/src/unix/mutex.c:34: undefined reference to `pthread_mutexattr_settype'
/nats-build-error/build/../subprojects/nats.c/src/unix/mutex.c:52: undefined reference to `pthread_mutexattr_destroy'
subprojects/nats.c/libcm_nats.so.p/src_unix_mutex.c.o: In function `natsMutex_TryLock':
/nats-build-error/build/../subprojects/nats.c/src/unix/mutex.c:61: undefined reference to `pthread_mutex_trylock'
subprojects/nats.c/libcm_nats.so.p/src_unix_mutex.c.o: In function `natsMutex_Lock':
/nats-build-error/build/../subprojects/nats.c/src/unix/mutex.c:74: undefined reference to `pthread_mutex_trylock'
subprojects/nats.c/libcm_nats.so.p/src_unix_thread.c.o: In function `nats_InitOnce':
/nats-build-error/build/../subprojects/nats.c/src/unix/thread.c:20: undefined reference to `pthread_once'
subprojects/nats.c/libcm_nats.so.p/src_unix_thread.c.o: In function `natsThread_Create':
/nats-build-error/build/../subprojects/nats.c/src/unix/thread.c:69: undefined reference to `pthread_create'
subprojects/nats.c/libcm_nats.so.p/src_unix_thread.c.o: In function `natsThread_Detach':
/nats-build-error/build/../subprojects/nats.c/src/unix/thread.c:112: undefined reference to `pthread_detach'
subprojects/nats.c/libcm_nats.so.p/src_unix_thread.c.o: In function `natsThread_Join':
/nats-build-error/build/../subprojects/nats.c/src/unix/thread.c:100: undefined reference to `pthread_join'
subprojects/nats.c/libcm_nats.so.p/src_unix_thread.c.o: In function `natsThreadLocal_CreateKey':
/nats-build-error/build/../subprojects/nats.c/src/unix/thread.c:145: undefined reference to `pthread_key_create'
subprojects/nats.c/libcm_nats.so.p/src_unix_thread.c.o: In function `natsThreadLocal_SetEx':
/nats-build-error/build/../subprojects/nats.c/src/unix/thread.c:165: undefined reference to `pthread_setspecific'
subprojects/nats.c/libcm_nats.so.p/src_unix_thread.c.o: In function `natsThread_Join':
/nats-build-error/build/../subprojects/nats.c/src/unix/thread.c:105: undefined reference to `pthread_detach'
subprojects/nats.c/libcm_nats.so.p/src_unix_thread.c.o: In function `natsThreadLocal_Get':
/nats-build-error/build/../subprojects/nats.c/src/unix/thread.c:157: undefined reference to `pthread_getspecific'
subprojects/nats.c/libcm_nats.so.p/src_unix_thread.c.o: In function `natsThreadLocal_DestroyKey':
/nats-build-error/build/../subprojects/nats.c/src/unix/thread.c:181: undefined reference to `pthread_key_delete'
collect2: error: ld returned 1 exit status
[62/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_parser.c.o
[63/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_status.c.o
[64/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_timer.c.o
[65/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_srvpool.c.o
[66/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_nats.c.o
[67/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_opts.c.o
[68/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_pub.c.o
[69/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_url.c.o
[70/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_js.c.o
[71/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_conn.c.o
[72/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_sub.c.o
[73/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_jsm.c.o
[74/86] Compiling C object subprojects/nats.c/libcm_nats_static.a.p/src_util.c.o
ninja: build stopped: subcommand failed.