构建环境如何将新的 LDFLAGS 引入自动配置构建

How can a build environment introduce new LDFLAGS into an autoconfig build

我正在两个不同的构建环境(buildroot 和 Yocto)中构建相同的库 (TI GBM)。来自 Yocto 的二进制文件可以工作,但来自 buildroot 的二进制文件由于分段错误而失败。我比较了两个构建系统中 autoconfig 生成的 makefile 并注意到 LDFLAGS 中的差异。

Yocto:

LDFLAGS =  -L/home/kyle/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib -Wl,-rpath-link,/home/kyle/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib -Wl,-O1 -Wl,--hash-style=gnu

构建根目录:

LDFLAGS = 

Yocto 如何将这些新的链接器指令添加到 makefile 中?

configure脚本为运行时,它会将环境中某些特定变量的值保存到Makefile中。 LDFLAGS 是其中一个变量,称为“precious variables”。

What is Yocto doing to introduce these new linker directives into the build?

LDFLAGS是linker选项,如果你熟悉gcc等命令行编译前端,make会在这内部调用gcc时尚(这里假设使用 C++):

g++ CPPFLAGS CXXFLAGS SOURCE_CODE LDFLAGS LDADD

这是您在 Yocto 中指定的 LDFLAGS 的示例:

g++ -Wall -g -O3 -o output myfiles... -L/home/kyle/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib -Wl,-rpath-link,/home/kyle/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib -Wl,-O1 -Wl,--hash-style=gnu

至于LDFLAGS的值是什么意思

-L/home/kyle/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib -Wl,-rpath-link,/home/kyle/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib -Wl,-O1 -Wl,--hash-style=gnu` 

意思是:

  • 在目录中搜索库:

    /home/kyle/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib

  • 动态 link 路径中的库:/home/kyle/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib

How is Yocto adding these new linker directives to the makefile?

Yocto 没有主动做任何事情——configure 脚本在做这项工作。它的全部目的是分析它 运行 所在的系统,以确定所需的工具,找出适当的标志,并确定各种系统设施的存在与否。这样做之后,它(通常)会通过填写程序源中包含的模板为您创建一个或多个 Makefile。它填写的内容之一是 LDFLAGS 变量的值。

configure 如何选择它所做的标志部分取决于它的编写方式,部分取决于它是如何 运行。您可以在 configure 命令行或其环境中指定一些变量,并且可以通过命令行选项影响其他变量。其中一些可以产生级联效应。例如,yocto 环境中 LDFLAGS 的特定选择可能与所选的 C 或 C++ 编译器有关。