LINUX.ORG.RU

libiec61850 для Linux ARM

 , , ,


0

2

Здравствуйте. В работе с Linux я еще новичок, пришлось столкнуться с ним во время работы. Постараюсь изложить проблему наиболее понятно.

Стоит задача реализовать соединение клиент/сервер по протоколу МЭК 61850. Для решения этой задачи я использовал библиотеку libiec61850. Мне необходимо собрать библиотеку для компиляции программы под Linux ARM процессор. Есть встраиваемый компьютер MOXA IA240-LX с процессором х86 MOXA ART ARM9. Для кросс-компиляции установлен tool-chain arm_linux_1.3 с диска, который был в комплекте с MOXA.

На офф. сайте библиотеки (http://libiec61850.com/libiec61850/documentation/building-the-library/) написано, что для сборки под ARM необходимо собрать make с TARGET=LINUX-ARM, однако есть ошибки:

make: arm-linux-gnueabi-gcc: Команда не найдена Makefile:152: ошибка выполнения рецепта для цели «build-arm/src/mms/iso_acse/acse.o» make: ***[build-arm/src/mms/iso_acse/acse.o] Ошибка 127

С сайта:

To cross-compile for ARM Linux you can call make TARGET=LINUX-ARM. It is assumed that a proper GCC cross-compiler toolchain (like MinGW or arm-linux-gcc) is installed. Probably you need to adjust the toolchain prefix variables in the file make/target_system.mk.

Как я понял, что если не собирается, то необходимо ввести поправки в файле make/target_system.mk. В работе с make файлами я полный ноль.

Если есть кто-нибудь, кто уже работал с этой библиотекой, то очень прошу помощи. На Windows в Visual Studio у меня все работает, необходимо только запустить все это дело на MOXA компьютере. Спасибо.

P.S. Вот сам make файл:

UNAME := $(shell uname)

MIPSEL_TOOLCHAIN_PREFIX=mipsel-openwrt-linux- # ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabihf- #ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabi- #ARM_TOOLCHAIN_PREFIX=arm-poky-linux-gnueabi- ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabi- UCLINUX_ARM_TOOLCHAIN_PREFIX=arm-uclinux-elf- MINGW_TOOLCHAIN_PREFIX=i586-mingw32msvc- #MINGW_TOOLCHAIN_PREFIX=x86_64-w64-mingw32- MINGW64_TOOLCHAIN_PREFIX=x86_64-w64-mingw32-

#POWERPC_TOOLCHAIN_PREFIX=powerpc-poky-linux- POWERPC_TOOLCHAIN_PREFIX=powerpc-linux-gnu-

ifndef TARGET ifeq ($(UNAME), Linux) TARGET=POSIX else ifeq ($(findstring MINGW,$(UNAME)), MINGW) TARGET=WIN32 else ifeq ($(UNAME), Darwin) TARGET=BSD else ifeq ($(UNAME), FreeBSD) TARGET=BSD endif endif

ifeq ($(TARGET), WIN32) WINDOWS=1 endif

ifeq ($(TARGET), WIN64) WINDOWS=1 endif

ifdef WINDOWS ifeq ($(UNAME), Linux) ifeq ($(TARGET), WIN32) TOOLCHAIN_PREFIX=$(MINGW_TOOLCHAIN_PREFIX) endif ifeq ($(TARGET), WIN64) TOOLCHAIN_PREFIX=$(MINGW64_TOOLCHAIN_PREFIX) endif else TOOLCHAIN_PREFIX= endif endif

ifeq ($(TARGET), LINUX-POWERPC) TOOLCHAIN_PREFIX=$(POWERPC_TOOLCHAIN_PREFIX) endif

ifeq ($(TARGET), LINUX-MIPSEL) TOOLCHAIN_PREFIX=$(MIPSEL_TOOLCHAIN_PREFIX) endif

ifeq ($(TARGET), LINUX-ARM) TOOLCHAIN_PREFIX=$(ARM_TOOLCHAIN_PREFIX) endif

ifeq ($(TARGET), UCLINUX-WAGO) TOOLCHAIN_PREFIX=$(UCLINUX_ARM_TOOLCHAIN_PREFIX) CFLAGS += -msoft-float CFLAGS += -Wall CFLAGS += -DEMBED CFLAGS += -Dlinux -D__linux__ -Dunix CFLAGS += -D__uClinux__ CFLAGS += -DTARGET=UCLINUX-WAGO LDFLAGS += -Wl,-move-rodata -Wl,-elf2flt endif

ifdef WINDOWS HAL_IMPL = WIN32 LIB_OBJS_DIR = $(LIBIEC_HOME)/build_win32 CFLAGS=-g -DWIN32

ifeq ($(TARGET), WIN32) CFLAGS+=-m32 endif

ifeq ($(TARGET), WIN64) CFLAGS+=-m64 endif

LDLIBS=-lws2_32 DYNLIB_LDFLAGS=-Wl,-no-undefined -Wl,--enable-runtime-pseudo-reloc -Wl,--output-def,libiec61850.def,--out-implib,libiec61850.a

# on Windows: only compile with ethernet support if winpcap files are in third_party/winpcap! ifneq (, $(wildcard $(LIBIEC_HOME)/third_party/winpcap/Include/.))

ifeq ($(TARGET), WIN64) LDFLAGS += -L$(LIBIEC_HOME)/third_party/winpcap/Lib/x64 else LDFLAGS += -L$(LIBIEC_HOME)/third_party/winpcap/Lib endif

LDLIBS+=-liphlpapi -lwpcap else $(warning winpcap not found - will build without GOOSE support!) CFLAGS += -DEXCLUDE_ETHERNET_WINDOWS EXCLUDE_ETHERNET_WINDOWS = 1 endif

else ifeq ($(TARGET), BSD) HAL_IMPL = BSD else HAL_IMPL = POSIX endif

LDLIBS = -lpthread

ifeq ($(TARGET), LINUX-MIPSEL) LIB_OBJS_DIR = $(LIBIEC_HOME)/build-mipsel else ifeq ($(TARGET), LINUX-ARM) LIB_OBJS_DIR = $(LIBIEC_HOME)/build-arm else ifeq ($(TARGET), UCLINUX-WAGO) LIB_OBJS_DIR = $(LIBIEC_HOME)/build-wago CFLAGS += -DTARGET_SYSTEM_UCLINUX_WAGO else ifeq ($(TARGET), LINUX-POWERPC) LIB_OBJS_DIR = $(LIBIEC_HOME)/build-powerpc else LIB_OBJS_DIR = $(LIBIEC_HOME)/build endif

CFLAGS += -g #CFLAGS += -Os

DYNLIB_LDFLAGS=-lpthread endif

ifneq ($(TARGET), CLANG-CHECK) CC=$(TOOLCHAIN_PREFIX)gcc CPP=$(TOOLCHAIN_PREFIX)g++ endif

ifeq ($(TARGET), BSD) CC=cc CPP=c++ endif

AR=$(TOOLCHAIN_PREFIX)ar RANLIB=$(TOOLCHAIN_PREFIX)ranlib

ifeq ($(TARGET), WIN32) PROJECT_BINARY_NAME := $(PROJECT_BINARY_NAME).exe endif

LIB_NAME = $(LIB_OBJS_DIR)/libiec61850.a

ifeq ($(TARGET), BSD) CFLAGS += -arch i386 LDFLAGS += -arch i386 endif

ifeq ($(TARGET), WIN32) DYN_LIB_NAME = $(LIB_OBJS_DIR)/iec61850.dll else

ifeq ($(TARGET), BSD) DYN_LIB_NAME = $(LIB_OBJS_DIR)/libiec61850.dylib else DYN_LIB_NAME = $(LIB_OBJS_DIR)/libiec61850.so endif

endif

Оно просто исполняемый файл (екзешник) компилятора не находит. Смотри куда он там поставился твоим тулчейном с диска - должен быть в $PATH. Плюс в самом верху мейкфайла предлагается подкорректировать его префикс. А то опять нисработает.

mos ★★★☆☆ ()
Ответ на: комментарий от mos

Да, большое спасибо!

Заменил

ARM_TOOLCHAIN_PREFIX=arm-linux-gnueabi-

на

ARM_TOOLCHAIN_PREFIX=/usr/local/arm-linux/bin/arm-linux-

Библиотека построилась, исполняемый файл заработал на MOXA.

alxzahar ()
Ответ на: комментарий от alxzahar

Переходите на сторону Линукса... тут есть печеньки.

Ставь Решено треду.

mos ★★★☆☆ ()
Ответ на: комментарий от alxzahar

В работе с Linux я еще новичок, пришлось столкнуться с ним во время работы

Ты не поверишь, но в винде всё на 100% аналогично, либо «экзешник» лежит в PATH либо полный путь к нему должен быть указан.

I-Love-Microsoft ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.