私のライブラリでlibuvを使用する必要があります。私はそれを2つの静的ライブラリにリンクすることができないので、私はlibuvのソースを自分のコードと一緒に入れることに決めました。私はダウンロードがlibuv .cmake
ファイルを持って、右のタグをチェックアウトし、変数にソースファイルを追加します。libuvをビルドするときの未定義のシンボル
include(DownloadProject.cmake)
download_project(PROJ libuv
GIT_REPOSITORY https://github.com/libuv/libuv.git
GIT_TAG v1.10.0
${UPDATE_DISCONNECTED_IF_AVAILABLE}
)
exec_program(COMMAND "./autogen.sh" WORKING_DIRECTORY ${libuv_SOURCE_DIR})
exec_program(COMMAND "./configure" WORKING_DIRECTORY ${libuv_SOURCE_DIR})
include_directories(${LIBUVDIR}/include ${LIBUVDIR}/src)
set(LIBUV_SOURCES
${LIBUVDIR}/include/uv.h
${LIBUVDIR}/include/tree.h
${LIBUVDIR}/include/uv-errno.h
${LIBUVDIR}/include/uv-threadpool.h
${LIBUVDIR}/include/uv-version.h
${LIBUVDIR}/src/fs-poll.c
${LIBUVDIR}/src/heap-inl.h
${LIBUVDIR}/src/inet.c
${LIBUVDIR}/src/queue.h
${LIBUVDIR}/src/threadpool.c
${LIBUVDIR}/src/uv-common.c
${LIBUVDIR}/src/uv-common.h
${LIBUVDIR}/src/version.c
)
など
私は、その後のリストにlibuvソースファイルのリストを追加追加ソース私のプロジェクトのためのファイルとその依存関係とライブラリをリンク:
include(libuv.cmake)
# Build library
set(SOURCE_FILES
<my sources>
${LIBUV_SOURCES})
add_library(databaseclient STATIC ${SOURCE_FILES})
set(CMAKE_THREAD_PREFER_PTHREAD 1)
set(THREADS_PREFER_PTHREAD_FLAG 1)
include(FindThreads)
target_link_libraries(databaseclient PUBLIC Threads::Threads)
しかし、私は、私は次のエラーを取得するmakeを実行します:
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はユニットテスト実行ファイルです。
私はリンクしていないものがあると思います。何がわからないのですか?すべての手がかりは?
ためCMakeLists.txtに持っているものです。注文が重要であることに注意してください。そして、ライブラリを使用した後でpthreadにリンクする必要があります。 – UKMonkey
オーダー問題ですか? – ruipacheco
'include(FindThreads)'の代わりに 'find(Threads REQUIRED)'を使用し、 'SET'コマンドの前に置いておきます。 – Amadeus