我在两个不同的构建环境(buildroot和Yocto)中构建相同的库(TI GBM)。来自Yocto的二进制文件工作,但是buildroot的二进制文件由于分段错误而失败。我比较了两个构建系统中autoconfig生成的makefile,并注意到了LDFLAGS的差异。
Yocto:
IntPtr
Buildroot里面:
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
Yocto如何将这些新的链接器指令添加到makefile中?
答案 0 :(得分:1)
Yocto在将这些新的链接器指令引入构建时做了什么?
LDFLAGS是链接器选项,如果您熟悉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
动态链接路径中的库:/home/kyle/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
答案 1 :(得分:1)
Yocto如何将这些新的链接器指令添加到makefile中?
Yocto没有积极做任何事情 - 正是configure
脚本完成了这项工作。其全部目的是分析运行它的系统,以识别所需的工具,找出适当的标志,并确定是否存在各种系统设施。完成后,它(通常)通过填写程序源包含的模板为您创建一个或多个Makefile
。它填写的内容之一是LDFLAGS
变量的值。
configure
如何选择它所做的标志部分取决于它是如何编写的,部分取决于它是如何运行的。您可以在configure
命令行或其环境中指定一些变量,并且可以通过命令行选项影响其他变量。其中一些可能具有级联效应。例如,yocto环境中LDFLAGS
的特定选择可能与所选的C或C ++编译器有关。
答案 2 :(得分:0)
运行configure
脚本时,它会将环境中某些特定变量的值保存到Makefile中。 LDFLAGS
是其中一个变量,名为“precious variables”。