我正在尝试为运行 openst-linux 发行版的 STM32MP157C-DK2 演示板编译一个简单的 hello-world 程序。我正在使用 Ubuntu-VM 和 OpenEmbedded/Yocto 进行交叉编译。如果我只使用一行来编译和链接程序,一切正常。但是,如果我将命令拆分为编译并链接生成的程序将不起作用。我想拆分进程,因为 Ecpise 分别调用编译器和链接器。
我可以使用这一行成功编译程序:
arm-openstlinux_weston-linux-gnueabi-gcc -march=armv7ve -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=[path to sysroot] -o gtk_hello_world_manual src/main.c -O2 -pipe -g -feliminate-unused-debug-types -Wall -pthread -I[long list of include directories] -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
这个结果是一个有效的 gtk_hello_world_manual 程序。我试图通过使用同一行来拆分进程,但使用 main.o 作为目标而不是 gtk_hello_world_manual。然后我将生成的 main.o 与这一行链接起来:
arm-openstlinux_weston-linux-gnueabi-ld --sysroot=[path to sysroot] -o gtk_hello_world_manual -O1 --hash-style=gnu --as-needed -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 main.o
两次程序都被编译和链接,没有错误。如果我使用单行编译/链接,程序在目标板上运行完美。
如果我使用拆分变体,则错误消息
“加载共享库时出错:类型:无法打开共享对象文件:没有这样的文件或目录”
出现并终止程序。
[编辑] 找到了解决方案:您必须使用 -c 选项调用编译器,以便不完成链接过程。这导致以下命令:
arm-openstlinux_weston-linux-gnueabi-gcc -march=armv7ve -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=[path to sysroot] -o main.o -c src/main.c -O2 -pipe -g -feliminate-unused-debug-types -Wall -pthread -I[long list of include directories]
然后使用 gcc 命令间接调用链接器:
arm-openstlinux_weston-linux-gnueabi-gcc -march=armv7ve -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=[path to sysroot] -O2 -pipe -g -feliminate-unused-debug-types -o gtk_helloworld_manual -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 main.o
这会产生一个工作程序文件。有了它,它可以包含在 ecplise makefile 项目中,并在 IDE 中构建和调试。