gcc编译器选项-Wl,--no-undefined(告诉链接器在链接过程中不允许有未定义的符号)(gcc编译器和链接器是分离的工具,它们需要通过选项来进行通信)
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcc编译器选项-Wl,--no-undefined(告诉链接器在链接过程中不允许有未定义的符号)(gcc编译器和链接器是分离的工具,它们需要通过选项来进行通信)相关的知识,希望对你有一定的参考价值。
gcc编译器选项-Wl,--no-undefined
选项解释
-Wl,--no-undefined
是一个gcc编译器的选项,它告诉链接器在链接过程中不允许有未定义的符号。
在链接一个程序时,链接器会将所有的目标文件(.o
文件)合并成一个可执行文件或动态链接库(.so
文件)。如果有未定义的符号,链接器将无法解析它们,因此会抛出“未定义符号”的错误。
使用-Wl,--no-undefined
选项可以帮助开发者在编译过程中发现未定义的符号,并及时进行处理。如果有未定义的符号存在,编译器会在链接时直接报错,以便开发者及时修复问题。
总的来说,-Wl,--no-undefined
选项是一种编译器的防御性编程技术,可以在编译时检测到潜在的问题,避免程序在运行时出现崩溃等错误。
关于-Wl,--no-undefined
奇特的样貌
-Wl,--no-undefined
这个选项的确看起来比较奇怪,但它实际上由三个部分组成:-Wl
、--no-undefined
和一个,
。
首先,-Wl
是gcc编译器的一个选项,它告诉编译器将后面的参数传递给链接器。这样做的原因是gcc编译器和链接器是分离的工具,它们需要通过选项来进行通信。
其次,--no-undefined
是链接器ld
的一个选项,它告诉链接器不要允许有未定义的符号。这个选项是链接器提供的,因为链接器才是最终将目标文件合并成可执行文件或动态链接库的工具。
最后,,
是用来分隔两个选项的。在命令行中,,
通常用来分隔不同的参数或选项,以便让操作系统正确解析命令。
所以,这个选项看起来比较奇怪是因为它由多个部分组成,并且包含了操作系统的一些约定。
示例
CMakeLists.txt
# 如果当前操作系统不是苹果,则使用 CheckCXXCompilerFlag 检查编译器是否支持 -Wl,--no-undefined 参数。
if (NOT APPLE)
check_cxx_compiler_flag(-Wl,--no-undefined HAS_NO_UNDEFINED)
# 如果编译器支持
if (HAS_NO_UNDEFINED)
set(CMAKE_EXE_LINKER_FLAGS "$CMAKE_EXE_LINKER_FLAGS -Wl,--no-undefined")
set(CMAKE_SHARED_LINKER_FLAGS "$CMAKE_SHARED_LINKER_FLAGS -Wl,--no-undefined")
set(CMAKE_MODULE_LINKER_FLAGS "$CMAKE_SHARED_LINKER_FLAGS -Wl,--no-undefined")
endif()
endif()
以上是关于gcc编译器选项-Wl,--no-undefined(告诉链接器在链接过程中不允许有未定义的符号)(gcc编译器和链接器是分离的工具,它们需要通过选项来进行通信)的主要内容,如果未能解决你的问题,请参考以下文章
什么是clang相当于--no-undefined gcc标志?