clang:警告:编译期间未使用的参数:'-rdynamic'

clang: warning: argument unused during compilation: '-rdynamic'

我尝试在 CMakeLists.txt 文件中使用 -rdynamic 选项,如下所示:

cmake_minimum_required(VERSION 3.5)
project(Tmuduo CXX)
...
set(CMAKE_CXX_STANDARD 11)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    add_compile_options(-Wthread-safety )
endif()

add_compile_options(
 # -DVALGRIND
 -Wall
 -Wno-unused-parameter
 -Woverloaded-virtual
 -Wpointer-arith
 -Wwrite-strings
 -O3
 -rdynamic
 )
...

当我使用 cmake .. -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clangmake VERBOSE=1 时,我收到如下消息:

正如您所见,-rdynamic 编译选项确实出现在 clang++ 命令中,编译器也抱怨该参数未被使用。但是当我使用下面的命令时,发生了一些奇怪的事情。

clang++ -I/home/phoenix/MyProject/Tmuduo -g -Wthread-safety -Wall -Wno-unused-parameter -Woverloaded-virtual -Wpointer-arith -Wwrite-strings -rdynamic -std=gnu++11 test/Exception_test.cc base/Exception.cc base/CurrentThread.cc -o exception_test -O3

一切顺利。这次,-rdynamic 选项起作用了。这真的让我很困惑。谁能告诉我这是怎么回事?为什么 clang++ 命令有效而 cmake 失败?

因为-rdynamic是一个linker选项,所以如果你在将源文件编译成对象时使用*.o它什么都不做,就没有link相位在这里。

当link将所有*.o和库编译成finally可执行文件时,它才真正被使用。

来自 man gcc(但 clang 使用相同):

        -rdynamic
           Pass the flag -export-dynamic to the ELF linker, on targets that support it.
           This instructs the linker to add all symbols, not only used ones, to the
           dynamic symbol table. This option is needed for some uses of "dlopen" or to
           allow obtaining backtraces from within a program.