CMake中的C++链接器标志

4

我正在编译一个C++程序,但一直收到以下错误信息:

undefined reference to 'pthread_mutexattr_init'
undefined reference to 'dlopen'
undefined reference to 'dlerror'
undefined reference to 'dlsym'
undefined reference to 'dlclose'

为了解决 pthread 的错误,我在我的 CMakeLists.txt 中添加了以下链接器标志。
if (UNIX)
     set(CMAKE_CXX_FLAGS "-pthread")
endif (UNIX)

这解决了pthread错误。为了解决libdl错误,我继续修改它如下。

if (UNIX)
     set(CMAKE_CXX_FLAGS "-pthread -dl")
endif (UNIX)

这给了我一个警告

unrecognized gcc debugging option: l

我进行了如下修改。
if (UNIX) 
     set(CMAKE_CXX_FLAGS "-pthread")
     set(CMAKE_CXX_FLAGS "-dl")
endif (UNIX)

并且一起收到了所有错误消息

unrecognized gcc debugging option: l.

我是否错过了在CMake中设置链接器标志的方法?我到底做错了什么?我使用的是Ubuntu 17.04 x64。


尝试过使用 target_link_libraries(yourtarget pthread dl) 吗? - Davide Spataro
2个回答

5

这是使用现代CMake方法处理 pthreaddl 的方式:

cmake_minimum_required(VERSION 3.9)
project(my_pthread_dl_project)

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads)
add_executable(myexe source.c)
target_link_libraries(myexe 
  Threads::Threads 
  ${CMAKE_DL_LIBS})

为什么这种方法比@Akira的方法更可取? - Amani
它不像特定于平台,并且没有坏习惯。 - utopia
1
在Windows 10和Ubuntu 17.04上进行了测试,它可以正常工作。谢谢。 - Amani

3

尝试以下方法,而不是覆盖CMAKE_CXX_FLAGS

project(FooProject)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include_dir)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/source_dir FOO_SOURCES)

add_executable(foo ${FOO_SOURCES})
target_link_libraries(foo pthread dl)
set 命令会覆盖变量。如果你像这样使用它:
set(CMAKE_CXX_FLAGS "-pthread")

旧的 CMAKE_CXX_FLAGS 概念将被替换。要向变量添加内容,您应该使用如下所示的 set 命令:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")

1
你为什么在这里使用 aux_source_directory - SirDarius
@SirDarius,只是为了完整起见。我在所有项目中使用aux_source_directory来收集源文件。 - Akira
2
我提到这个是因为文档明确表示这不是一个好的实践,这个命令只应该用于显式模板实例化。在CMake中,明确列出源文件是首选方式。 - SirDarius
@SirDarius,感谢您的澄清。这可能是我的坏习惯,起源于Qt Creator的CMake项目模板。 - Akira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接