我正在使用 autotools 构建的 Linux 应用程序中添加一些 pthreads 代码。我收到关于未在 libpthreads 中链接的错误。所以我想在 autotools 中指定 pthreads 依赖项和编译器/链接器标志。
我发现一些引用说使用ACX_PTHREAD
宏。GNU 提供了一个AX_PTHREAD
宏. 两者在概念上非常相似。但我都尝试过(在 Ubuntu 13.04 64 位上),发现它们设置-pthread
为$PTHREAD_CFLAGS
,但由于某种原因,他们没有-lpthread
在$PTHREAD_LIBS
.
构建失败。当我运行时make
,我得到:
...
/bin/sh ../libtool --tag=CXX --mode=link g++ -g -O2 -o myapp main.o ... -lconfuse -llog4cpp -lnsl -lpopt -lfuse -L/usr/local/lib -lrt
libtool: link: g++ -g -O2 -o .libs/myapp main.o ... -lconfuse -llog4cpp -lnsl /usr/lib/x86_64-linux-gnu/libpopt.so -lfuse -L/usr/local/lib -lrt
/usr/bin/ld: app-fuse.o: undefined reference to symbol 'pthread_kill@@GLIBC_2.2.5'
/usr/bin/ld: note: 'pthread_kill@@GLIBC_2.2.5' is defined in DSO /lib/x86_64-linux-gnu/libpthread.so.0 so try adding it to the linker command line
/lib/x86_64-linux-gnu/libpthread.so.0: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
...
在这种情况下,./configure
步骤显示:
...
checking for the pthreads library -lpthreads... no
checking whether pthreads work without any flags... no
checking whether pthreads work with -Kthread... no
checking whether pthreads work with -kthread... no
checking for the pthreads library -llthread... no
checking whether pthreads work with -pthread... yes
checking for joinable pthread attribute... PTHREAD_CREATE_JOINABLE
checking if more special flags are required for pthreads... no
checking for PTHREAD_PRIO_INHERIT... yes
...
我注意到它会检查-lpthreads
,但它不应该检查-lpthread
吗?
我发现我可以使用:
AC_CHECK_LIB(pthread, pthread_create, [PTHREAD_LIBS+=-lpthread])
然后构建成功。但我认为这不是让它在最广泛的平台上工作的最佳方式。
我看到 Ubuntu 也有一个包libpthread-stubs0-dev
。但我不确定它的用途。
将 pthread 与 autotools 一起使用的“正确方法”是什么?