在命令行中编译精细时使用CMakeLists会导致错误

时间:2017-06-22 23:20:24

标签: gcc cmake posix clion

我正在编译我的代码,其中我在C中使用posix线程。

我正在使用CLion及其CMakeLists.txt:

cmake_minimum_required(VERSION 3.7)
project(Test)

set(CMAKE_C_STANDARD 99)
add_definitions(-lpthread)

set(SOURCE_FILES main.c)

add_executable(Test ${SOURCE_FILES})

我收到错误(例如:undefined reference to sem_init'`)。

建议的解决方案建议是添加-lpthread编译器标志,但我已经添加了它。

我从命令行编译了相同的代码:

gcc main.c -lpthread

它编译没有任何问题。

这可能是什么问题/解决方案?

1 个答案:

答案 0 :(得分:3)

完全删除add_definitions(-lpthread),因为pthread不是定义,而是库依赖。

add_executable()之后添加:

target_link_libraries(Test pthread)

此外,如果您想查看CMake使用的命令而不必检查其文件,您可以在cmake -DCMAKE_VERBOSE_MAKEFILE=ON ...的命令行中使用它。

顺便说一下,总是更喜欢target_*所有target_compile_definitions()命令,而不是旧版add_definitions()。这样可以保持项目属性和依赖关系的清洁,并最大限度地减少不同目标之间的干扰。

如果在上述更改之后您的代码仍然无法编译,那么代码本身很可能是错误的(与CMake无关)。