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编译器和链接器是分离的工具,它们需要通过选项来进行通信)的主要内容,如果未能解决你的问题,请参考以下文章

GCC选项_-Wl,-soname

什么是clang相当于--no-undefined gcc标志?

-Wl,-rpath=

我不明白-Wl,-rpath -Wl,

GCC 的“-Wl,option”和“-Xlinker option”语法有区别吗?

Windows脚本中怎么使用逗号