Undefined symbols when building libuv
我需要在我的库中使用 libuv。由于我无法将它链接到两个静态库,因此我决定将 libuv 的源代码与我的代码一起包含在内。我有一个 .cmake 文件,它下载 libuv,签出正确的标签并将源文件添加到变量中:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
include(DownloadProject.cmake)
download_project(PROJ libuv include_directories(${LIBUVDIR}/include ${LIBUVDIR}/src) |
等
然后我将 libuv 源文件列表添加到我的项目的源文件列表中,并将库与其依赖项链接:
1
2 3 4 5 6 7 8 9 10 11 |
include(libuv.cmake)
# Build library |
但是当我运行 make 我得到以下错误:
1
2 3 4 5 6 7 8 9 10 11 12 |
Undefined symbols for architecture x86_64:
“_pthread_barrier_destroy”, referenced from: _uv_barrier_destroy in libdatabaseclient.a(thread.c.o) “_pthread_barrier_init”, referenced from: _uv_barrier_init in libdatabaseclient.a(thread.c.o) “_pthread_barrier_wait”, referenced from: _uv_barrier_wait in libdatabaseclient.a(thread.c.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use –v to see invocation) make[2]: *** [tests/unit_tests] Error 1 make[1]: *** [tests/CMakeFiles/unit_tests.dir/all] Error 2 make: *** [all] Error 2 |
unit_tests 是我的单元测试可执行文件。
我认为有些东西我没有链接,只是不知道是什么。有什么线索吗?
- 猜测 – pthread 库。请注意,顺序很重要,您应该在使用它的库之后链接到 pthread
- 你说顺序很重要?
- 我会使用 find(Threads REQUIRED) 而不是 include(FindThreads) 并将其放在 SET 命令之前
- @ruipacheco 当然链接订单很重要。 stackoverflow.com/questions/45135/…
您好,我刚刚遇到了同样的问题,似乎 pthread_barrier 原语并未在 MacOS 上实现,尽管它声称符合 POSIX。 LibUV 使用其他线程原语实现它自己的版本。如果您将 ${LIBUVDIR}/src/unix/pthread-barrier.c 添加到您的 libuv c 文件列表中,它应该正确链接。
这是我在 CMakeLists.txt 中为 libuv 提供的内容
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
set(LIBUVDIR libuv)
include_directories(${LIBUVDIR}/include ${LIBUVDIR}/src) if(${CMAKE_SYSTEM_NAME} STREQUAL“Linux”) include_directories(${LIBUVDIR}/src/unix) add_library(uv STATIC ${SOURCES}) target_link_libraries(uv pthread) |
来源:https://www.codenong.com/40287753/