2016-10-27 6 views
0

私のライブラリで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はユニットテスト実行ファイルです。

私はリンクしていないものがあると思います。何がわからないのですか?すべての手がかりは?

+0

ためCMakeLists.txtに持っているものです。注文が重要であることに注意してください。そして、ライブラリを使用した後でpthreadにリンクする必要があります。 – UKMonkey

+0

オーダー問題ですか? – ruipacheco

+0

'include(FindThreads)'の代わりに 'find(Threads REQUIRED)'を使用し、 'SET'コマンドの前に置いておきます。 – Amadeus

答えて

2

こんにちは私はちょうどこの同じ問題に直面した、それはpthread_barrierプリミティブがPOSIXの準拠の主張にもかかわらずMacOSで実装されていないようです。 LibUVは他のスレッドプリミティブを使用して独自のバージョンを実装しています。 libuv cファイルのリストに${LIBUVDIR}/src/unix/pthread-barrier.cを追加すると、正しくリンクされます。 pthreadのライブラリ - ここ

は、私は推測でlibuv

set(LIBUVDIR libuv) 

include_directories(${LIBUVDIR}/include ${LIBUVDIR}/src) 
set(SOURCES 
    ${LIBUVDIR}/src/fs-poll.c 
    ${LIBUVDIR}/src/inet.c 
    ${LIBUVDIR}/src/threadpool.c 
    ${LIBUVDIR}/src/uv-common.c 
    ${LIBUVDIR}/src/version.c) 

if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") 
    add_definitions(-D_GNU_SOURCE) 
    set(SOURCES ${SOURCES} 
    ${LIBUVDIR}/src/unix/linux-syscalls.c 
    ${LIBUVDIR}/src/unix/linux-core.c 
    ${LIBUVDIR}/src/unix/linux-inotify.c) 
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") 
    add_definitions(-D_DARWIN_USE_64_BIT_INODE=1 -D_DARWIN_UNLIMITED_SELECT=1) 
    set(SOURCES ${SOURCES} 
    ${LIBUVDIR}/src/unix/darwin.c 
    ${LIBUVDIR}/src/unix/darwin-proctitle.c 
    ${LIBUVDIR}/src/unix/fsevents.c 
    ${LIBUVDIR}/src/unix/kqueue.c 
    ${LIBUVDIR}/src/unix/pthread-barrier.c 
    ${LIBUVDIR}/src/unix/proctitle.c) 
endif() 

include_directories(${LIBUVDIR}/src/unix) 
set(SOURCES ${SOURCES} 
    ${LIBUVDIR}/src/unix/async.c 
    ${LIBUVDIR}/src/unix/core.c 
    ${LIBUVDIR}/src/unix/dl.c 
    ${LIBUVDIR}/src/unix/fs.c 
    ${LIBUVDIR}/src/unix/getaddrinfo.c 
    ${LIBUVDIR}/src/unix/getnameinfo.c 
    ${LIBUVDIR}/src/unix/loop-watcher.c 
    ${LIBUVDIR}/src/unix/loop.c 
    ${LIBUVDIR}/src/unix/pipe.c 
    ${LIBUVDIR}/src/unix/poll.c 
    ${LIBUVDIR}/src/unix/process.c 
    ${LIBUVDIR}/src/unix/signal.c 
    ${LIBUVDIR}/src/unix/stream.c 
    ${LIBUVDIR}/src/unix/tcp.c 
    ${LIBUVDIR}/src/unix/thread.c 
    ${LIBUVDIR}/src/unix/timer.c 
    ${LIBUVDIR}/src/unix/tty.c 
    ${LIBUVDIR}/src/unix/udp.c) 

add_library(uv STATIC ${SOURCES}) 

target_link_libraries(uv pthread) 
関連する問題