如何在Clion ide中配置CMakeList以使用POSIX pthread函数?

时间:2016-10-18 07:06:11

标签: cmake pthreads posix clion

我尝试在CLIon ide中编译一个简单的POSIX示例,但它不知道pthread库,我认为...... 这是代码:

void *func1()
{
    int i;
    for (i=0;i<10;i++) { printf("Thread 1 is running\n"); sleep(1); }
}
void *func2()
{
    int i;
    for (i=0;i<10;i++) { printf("Thread 2 is running\n"); sleep(1); }
}

int result, status1, status2;
pthread_t thread1, thread2;

int main()
{
    result = pthread_create(&thread1, NULL, func1, NULL);
    result = pthread_create(&thread2, NULL, func2, NULL);
    pthread_join(thread1, &status1);
    pthread_join(thread2, &status2);
    printf("\nПотоки завершены с %d и %d", status1, status2);

    getchar();
    return 0;
}

众所周知,这段代码是正确的,因为它取自本书中的例子。所以Clion将pthread_join函数的第二个参数标记为错误,给出了这个错误:

error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’ 

我想,问题出在CmakeList中。这是我目前的CMakeList:

cmake_minimum_required(VERSION 3.3)
project(hello_world C CXX)



set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")



set(SOURCE_FILES main.cpp)
add_executable(hello_world ${SOURCE_FILES})

1 个答案:

答案 0 :(得分:3)

回调到pthread的函数签名错误。

func1func2具有签名void* (*)()。这意味着返回void *并且没有参数

但是pthread想要void* (*)(void*)这里你还有void*作为参数。

所以你的功能应该是这样的:

void *func1(void* param) ...

您不必使用参数,但必须在声明中。

注意:

要告诉cmake链接pthread你应该使用它:

find_package( Threads REQUIRED ) 
add_executable(hello_world ${SOURCE_FILES})
target_link_libraries( hello_world Threads::Threads )

见这里:How do I force cmake to include "-pthread" option during compilation?