Результат кросс-компиляции GCC выдает ошибку, если компоновщик вызывается отдельно - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь скомпилировать простую программу hello-world для демоверсии STM32MP157C-DK2, которая запускает дистрибутив openst-linux.Я использую Ubuntu-VM и OpenEmbedded / Yocto для кросс-компиляции.Все работает нормально, если я скомпилирую и свяжу программу, используя только одну строку.Но если я разделю команду на компиляцию и связывание полученной программы не получится.Я хочу разделить процесс, потому что Ecplise вызывает компилятор и компоновщик по отдельности.

Я могу успешно скомпилировать программу, используя следующую строку:

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

В результате получается рабочий файл программы.Благодаря этому его можно включить в проект make-файла ecplise, а также собрать и отладить в IDE.

1 Ответ

0 голосов
/ 23 сентября 2019

Нашел решение и добавил его в исходный пост.Сделал этот ответ, чтобы я мог пометить его как решенный.

...