【问题标题】:How to get pthread handling right?如何正确处理 pthread?
【发布时间】:2014-02-19 21:06:42
【问题描述】:

我正在尝试交叉编译telldus-core,以便能够在我的 Synology NAS 上使用Tellstick。我首先使用以下命令运行 C​​make:

bengt@bengt-VirtualBox:/usr/local/src/telldus-core-2.1.1/build$ cmake -DCMAKE_C_COMPILER=/usr/bin/arm-linux-gnueabi-gcc-4.7 -DCMAKE_CXX_COMPILER=/usr/bin/arm-linux-gnueabi-g++-4.7 -DCMAKE_INSTALL_PREFIX=/opt -pthread ..

这导致以下输出:

-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  

然后运行 ​​make 结果:

[ 98%] Building CXX object tdtool/CMakeFiles/tdtool.dir/main.cpp.o
Linking CXX executable tdtool
/usr/local/src/telldus-core-2.1.1/build/client/libtelldus-core.so: undefined reference to `pthread_create'
/usr/local/src/telldus-core-2.1.1/build/client/libtelldus-core.so: undefined reference to `pthread_join'
collect2: fel: ld returnerade avslutningsstatus 1
make[2]: *** [tdtool/tdtool] Fel 1
make[1]: *** [tdtool/CMakeFiles/tdtool.dir/all] Fel 2
make: *** [all] Fel 2
bengt@bengt-VirtualBox:/usr/local/src/telldus-core-2.1.1/build$ 

我应该怎么做才能解决这个问题?

【问题讨论】:

    标签: makefile cmake cross-compiling


    【解决方案1】:

    嘎嘎!你为什么在 sudo 下运行 cmake ?!?!恐怖。

    此错误是因为您尚未将-lpthread(POSIX 线程库)添加到您的链接行。我不认为在 cmake 命令行末尾添加 -pthread 会做到这一点。您需要修改 CMakeLists.txt 文件并确保编译行和链接行都存在该标志。

    或者我猜你可以尝试这样做:

    cmake -DCMAKE_C_COMPILER='/usr/bin/arm-linux-gnueabi-gcc-4.7 -pthread' \
        -DCMAKE_CXX_COMPILER='/usr/bin/arm-linux-gnueabi-g++-4.7 -pthread' \
        -DCMAKE_INSTALL_PREFIX=/opt ...
    

    【讨论】:

    • 在 CMakeLists.txt 中将 -pthread 作为 gcc 和 g++ 的编译器标志起到了作用,谢谢!
    • 改为回答。
    【解决方案2】:

    通过添加到 /CMakeFiles.txt /tdtool/CMakeFiles.txt/tdadmin/CMakeFiles.txt 的以下行来编译它

    SET(FORCE_COMPILE_FROM_TRUNK TRUE)
    SET(GCC_COVERAGE_COMPILE_FLAGS "-Wno-narrowing")
    SET(GCC_COVERAGE_LINK_FLAGS "-pthread -lpthread")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
    

    【讨论】:

      猜你喜欢
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多