C++ CMake 中的链接器标志

C++ linker flags in CMake

本文关键字:标志 链接 CMake C++      更新时间:2023-10-16

我正在编译一个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。

这是用于pthreaddl的现代规范 CMake 方法:

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})

请尝试以下方法,而不是覆盖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")