Кросс-компиляция с использованием Renesas G1E toolchain. Ошибка компоновщика, хотя библиотечные файлы уже есть в каталоге lib - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь кросс-компилировать код C (вне yocto), используя цепочку инструментов (/home/amruta/Downloads/poky-glibc-x86_64-core-image-weston-sdk-cortexa7hf-neon-toolchain-2.4.2.sh)для Renesas G1E модуль.Процедура для кросс-компиляции:

  1. Установлен данный набор инструментов

  2. Установить среду:

amruta@amruta-OptiPlex-3060:~$ . /opt/poky/2.4.2/environment-setup-cortexa7hf-neon-poky-linux-gnueabi 
Компиляция в том же терминале:
amruta@amruta-OptiPlex-3060:~/amruta/amruta_projects/G1E/EnergyMeterApp1/src$ $CC *.c -o Energymeter -L /opt/poky/2.4.2/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/libmosquitto -I /opt/poky/2.4.2/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include/

Исходные файлы, используемые для кросс-компиляции:

amruta@amruta-OptiPlex-3060:~/amruta/amruta_projects/G1E/EnergyMeterApp1/src$ ls
client_shared_lib.c  EnergyMeterApp1.h  GenericFunctions.c  modbus                 ProcessHandler.c
client_shared_lib.h  FileLogger.c       GenericFunctions.h  mosq_pub_sub_client.c  ProcessHandler.h
FileLogger.h       libconfig.h         mosq_pub_sub_client.h  ReadAllConfigs.c
EnergyMeterApp1.c    GenericDefns.h     Makefile            mosquitto.h            ReadAllConfigs.h

Библиотечные файлы, уже присутствующие в lib dir

amruta@amruta-OptiPlex-3060:~$ ls /opt/poky/2.4.2/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib | grep libmos
libmosquitto.so.1
amruta@amruta-OptiPlex-3060:~$ ls /opt/poky/2.4.2/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib | grep libconf
libconfig.so.9
libconfig++.so.9
libconfig.so.9.2.0
libconfig++.so.9.2.0
amruta@amruta-OptiPlex-3060:~$ 

В заголовочных файлах присутствуют: dir

amruta@amruta-OptiPlex-3060:~$ ls /opt/poky/2.4.2/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include/ | grep mos
mosquitto.h

amruta@amruta-OptiPlex-3060:~$ ls /opt/poky/2.4.2/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include/ | grep libconfig
libconfig.h

Выход сборки (частичный):

amruta@amruta-OptiPlex-3060:~/amruta/amruta_projects/G1E/EnergyMeterApp1/src$ $CC *.c -o Energymeter -L /opt/poky/2.4.2/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/libmosquitto -I /opt/poky/2.4.2/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include/ 

/tmp/ccBMhPYg.o: In function client_id_generate': 
client_shared_lib.c:(.text+0x64): undefined reference to mosquitto_lib_cleanup' 
client_shared_lib.c:(.text+0x144): undefined reference to `mosquitto_lib_cleanup' 

/tmp/ccRMPfVp.o: In function ReadEnergyMeterConfigs': 
ReadAllConfigs.c:(.text+0x374): undefined reference to config_init' 
ReadAllConfigs.c:(.text+0x384): undefined reference to config_read_file' 
ReadAllConfigs.c:(.text+0x3c8): undefined reference to config_destroy' 

Пожалуйста, предложите для успешной кросс-компиляции.

1 Ответ

1 голос
/ 25 мая 2019

Указание каталога библиотеки (-L <dir>) не приведет к тому, что какие-либо библиотеки в нем будут связаны. Переключатель -L только сообщает компоновщику, где искать библиотеки, указанные переключателями -l <lib>, которых у вас нет.

Вам необходимо добавить -l mosquitto для ссылки на libmosquitto.so, например. Аналогично -l config для libconfig.so.

В целом, для любой библиотеки libXXX.so или libXXX.a вы связываете ее с -l XXX. Там, где библиотеки имеют версии, как в этом случае, будет установлена ​​последняя версия. Чтобы связать конкретную версию, вы не используете -l <lib>, а просто указываете путь к конкретному .so-файлу в качестве ввода без переключателя '-'.

...