Pho*_*hao 1 c++ cmake clang compiler-warnings
-rdynamic我尝试在 CMakeLists.txt 文件中使用选项,如下所示:
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
)
...
Run Code Online (Sandbox Code Playgroud)
当我使用cmake .. -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clangand时make VERBOSE=1,我收到一些消息如下:

正如您所看到的,-rdynamic编译选项确实出现在 clang++ 命令中,并且编译器还抱怨该参数未使用。但是当我使用下面的命令时,奇怪的事情发生了。
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
)
...
Run Code Online (Sandbox Code Playgroud)
一切顺利。这次,这个-rdynamic选项起作用了。这确实让我很困惑。谁能告诉我这是怎么回事?为什么 clang++ 命令有效而 cmake 失败?
因为-rdynamic是一个链接器选项,所以如果您在将源文件编译为对象时使用它*.o,它不会执行任何操作,因此这里没有链接阶段。
当将所有*.o和 库链接到最终可执行文件时,它就会被实际使用。
来自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.
Run Code Online (Sandbox Code Playgroud)