Как добавить компиляцию библиотеки (заголовок + .c) в MakeFile (Eclipse)?

Я работаю над проектом, кодирую на C++, чтобы разработать связь Modbus через TCP/IP между Raspberry pi и Arduino.

У меня есть базовый пример «hello world», который работает в Raspberry. Я хочу добавить библиотеку libmodbus (файлы .h и .c) в свой проект Eclipse и протестировать предоставленный серверный модульный тест. Я уже добавил каталог в «Путь и символ» (GNU C и GNU C++) и «включено».

В MakeFile я добавил каталог раздела файла libmodbus (#Включить пути). Когда я создаю проект, компилируются только файлы .h, а не файл .c. «modbus.h» распознается, но это ошибки, такие как «неопределенная ссылка на .... (функции Modbus).

Я протестировал много решений, но пока не работает.

Заранее спасибо.

    ################################################################################
# MAKEFILE    : RPi2Test01

################################################################################

#===============================================================================
# User compiling options
#===============================================================================

#HOST: PC, PCLINUX, ARM
HOST := PC
#HOST := PCLINUX
#HOST :: ARM

#TARGET: PC, ARM, RASPBERRYPI
#TARGET := PC
#TARGET := ARM
TARGET := RASPBERRYPI

#DEBUG: YES, NO
DEBUG := NO

#===============================================================================
# Compiling options
#===============================================================================
#-------------------------------------------------------------------------------
# Determine compiling environment #ENVIRONMENT: CYGWIN,LINUX,WCROSS,LCROSS,ARM
#-------------------------------------------------------------------------------

ifeq ($(HOST),PC)
  ifeq ($(TARGET),PC)
    ENVIRONMENT := CYGWIN
  else
    ENVIRONMENT := WCROSS
  endif
else
  ifeq ($(HOST),LINUXPC)
    ifeq ($(TARGET),PC)
      ENVIRONMENT := LINUX
    else
      ENVIRONMENT := LCROSS
    endif
  else
    ifeq ($(HOST),ARM)
      ENVIRONMENT := ARM
    endif
  endif
endif

#-------------------------------------------------------------------------------
# Customize: WIN32 (CYGWIN)
#-------------------------------------------------------------------------------

ifeq ($(ENVIRONMENT),CYGWIN)
  PREFIX    := 
  BINPREFIX := 
  CFLAGS    := -std=gnu99 -Wno-write-strings
  CFLAGS    += -D_WIN32_ -D__CYGWIN__ -D_$(TARGET)_
  CPPFLAGS  := -pipe -g2 -Wall -Wno-write-strings -Wno-reorder
  CPPFLAGS  += -D_WIN32_ -D__CYGWIN__ -D_$(TARGET)_
  LDFLAGS   := -enable-auto-import
  LIBEXT    := .a
  BINEXT    := .exe
endif

#-------------------------------------------------------------------------------
# Customize: LINUX (LINUX)
#-------------------------------------------------------------------------------

ifeq ($(ENVIRONMENT),LINUX)
  PREFIX    := 
  BINPREFIX := 
  CFLAGS    := -std=gnu99 -Wno-write-strings
  CFLAGS    += -D_LINUX_ -D_$(TARGET)_
  CPPFLAGS  := -Wno-write-strings -Wno-reorder
  CPPFLAGS  += -D_LINUX_ -D_$(TARGET)_
  LDFLAGS   := -g
  LIBEXT    := .a
  BINEXT    := .out
endif

#-------------------------------------------------------------------------------
# Customize: Cross-compiling CYGWIN to ARM-LINUX-LINARO (WCROSS)
#-------------------------------------------------------------------------------

ifeq ($(ENVIRONMENT),WCROSS)
  PREFIX    := arm-linux-gnueabihf-
  BINPREFIX := /cygdrive/c/Linaro/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09/bin/
  CFLAGS    := -std=gnu99 -Wno-write-strings
  CFLAGS    += -D_LINUX_ -D_$(TARGET)_
  CPPFLAGS  := -Wno-write-strings -Wno-reorder
  CPPFLAGS  += -D_LINUX_ -D_$(TARGET)_
  LDFLAGS   := -g
  LIBEXT    := .a
  BINEXT    := .out
endif

#-------------------------------------------------------------------------------
# Customize: Cross-compiling LINUX to ARM-LINUX-LINARO (LCROSS)
#-------------------------------------------------------------------------------

ifeq ($(ENVIRONMENT),LCROSS)
  PREFIX    := arm-linux-gnueabihf-
  BINPREFIX := /usr/local/Linaro/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09/bin/
  CFLAGS    := -std=gnu99 -Wno-write-strings
  CFLAGS    += -D_LINUX_ -D_$(TARGET)_
  CPPFLAGS  := -Wno-write-strings -Wno-reorder
  CPPFLAGS  += -D_LINUX_ -D_$(TARGET)_
  LDFLAGS   := -g
  LIBEXT    := .a
  BINEXT    := .out
endif

#-------------------------------------------------------------------------------
# Customize: ARM-LINUX-LINARO (ARM)
#-------------------------------------------------------------------------------

ifeq ($(ENVIRONMENT),ARM)
  PREFIX    := 
  BINPREFIX := 
  CFLAGS    := -std=gnu99 -Wno-write-strings
  CFLAGS    += -D_LINUX_ -D_$(TARGET)_
  CPPFLAGS  := -Wno-write-strings -Wno-reorder
  CPPFLAGS  += -D_LINUX_ -D_$(TARGET)_
  LDFLAGS   := -g
  LIBEXT    := .a
  BINEXT    := .out
endif

#-------------------------------------------------------------------------------
# Compiling and linking features - Paths and libraries
#-------------------------------------------------------------------------------

CINC_PATH := $(INCLUDE)

CLIB_PATH := $(CLIB_PATH)

ifeq ($(ENVIRONMENT),ARM)
  CINC_PATH += -I/usr/local/include
  CLIB_PATH += -L/usr/local/lib
endif

ifeq ($(DEBUG),YES)
  LIBSUBFIX := d
  CPPFLAGS  += -D_DEBUG_
else
  LIBSUBFIX :=
  CPPFLAGS  +=
endif

LDADDLIBS += -lpthread -lrt -lm -lstdc++

#===============================================================================
# Building tools
#===============================================================================

CC   := @$(BINPREFIX)$(PREFIX)gcc
CXX  := @$(BINPREFIX)$(PREFIX)g++
LD   := @$(BINPREFIX)$(PREFIX)ld
AR   := @$(BINPREFIX)$(PREFIX)ar
MD   := @mkdir -p
RM   := @rm -rf
ECHO := @echo

#===============================================================================
# File pathts
#===============================================================================

SRCDIR := .
OBJPATH := ./OBJ
LIBPATH := ./LIB
GENPATH := ./BIN

#===============================================================================
# Source files
#===============================================================================

MAIN_HOME := $(SRCDIR)
CPP_SRCS_MAIN := $(MAIN_HOME)/RPi2Test01.cpp 

#===============================================================================
# Object files
#===============================================================================

OBJS_MAIN := $(patsubst $(MAIN_HOME)/%.cpp, \
               $(OBJPATH)/%.cpp.o, \
               $(CPP_SRCS_MAIN))

#LIB_SRC := C:/libmodbus-3.0.6/src/%.c        

#LIBSMAIN := $(patsubst  C:/libmodbus-3.0.6/src/%.c, \
                  $(LIBPATH)/%.c.o, \
               $(LIB_SRC))


#===============================================================================
# Building options
#===============================================================================

# Include paths
CINC_PATH += -I C:/libmodbus-3.0.6/src
CLIB_PATH += -L C:/libmodbus-3.0.6/src

CLIB_PATH += -L$(LIBPATH) 



# Compiling and Linking options
CFLAGS   := $(CINC_PATH) $(CFLAGS) 
CPPFLAGS := $(CINC_PATH) $(CPPFLAGS)
LDFLAGS  := $(CLIB_PATH) $(LDFLAGS)

#===============================================================================
# Building targets
#===============================================================================

BINMAIN := $(GENPATH)/RPi2Test01$(BINEXT)

#-------------------------------------------------------------------------------
# All targets
#-------------------------------------------------------------------------------
.PHONY: all
all: dirs $(BINMAIN)

#-------------------------------------------------------------------------------
# Building directories
#-------------------------------------------------------------------------------
dirs:
    $(MD) $(OBJPATH)
    $(MD) $(LIBPATH)
    $(MD) $(GENPATH)

#-------------------------------------------------------------------------------
# Targets
#-------------------------------------------------------------------------------

$(BINMAIN): $(OBJS_MAIN) $(LIBSMAIN) 
    $(ECHO) 'Building target: $@'
    $(CC) $(OBJS_MAIN) -o$@ $(LDFLAGS) $(LDADDLIBS) 

#-------------------------------------------------------------------------------
# Compiling
#-------------------------------------------------------------------------------

# File compiling: Main Programs ------------------------------------------------
$(OBJPATH)/%.cpp.o: $(MAIN_HOME)/%.cpp 
    $(ECHO) 'Building file: $<'
    $(CXX) -c $(CPPFLAGS) -o$@ $<
#===============================================================================
# Clean
#===============================================================================
.PHONY: clean
clean:
    $(ECHO) 'Removing...'
    $(RM) ${OBJPATH}/*.o ${OBJPATH}/*.err ${OBJPATH}/*.map
    $(RM) ${GENPATH}/*.o ${GENPATH}/*.out ${GENPATH}/*.exe ${GENPATH}/*.tmp 
    $(RM) ${SRCDIR}/*.a ${OBJPATH}/*.a ${LIBPATH}/*.a ${GENPATH}/*.a
    $(RM) ${SRCDIR}/*.so ${OBJPATH}/*.so ${LIBPATH}/*.so ${GENPATH}/*.so
    $(RM) ${SRCDIR}/*.out.stackdump ${SRCDIR}/*.exe.stackdump 
    $(RM) ${GENPATH}/*.out.stackdump ${GENPATH}/*.exe.stackdump 
    $(RM) ${OBJPATH} ${LIBPATH} ${GENPATH}
    $(RM) ./*.o ./*.out ./*.exe ./*.a ./*.so ./*.err ./*.map
    $(RM) ./*.out.stackdump ./*.exe.stackdump
    $(ECHO) 'Files removed'

person Steve Dsp    schedule 15.05.2017    source источник


Ответы (1)


Вероятно, вам нужно добавить -lmodbus к вашей переменной LDADDLIBS:

LDADDLIBS += -lmodbus -lpthread -lrt -lm -lstdc++
person igagis    schedule 15.05.2017
comment
Спасибо, я добавил эту строку, но она не работает. cannot find -lmodbus - person Steve Dsp; 15.05.2017
comment
Убедитесь, что в /usr/lib есть libmodbus.so - person igagis; 15.05.2017
comment
Нет, у меня нигде нет libmodbus.so. Я только что скачал файлы libmodbus на официальном сайте - person Steve Dsp; 15.05.2017
comment
В каталоге LIB в моей рабочей области нет ничего - person Steve Dsp; 15.05.2017
comment
У вас есть где-нибудь libmodbus.so или libmodbus.a? Может в архиве скачанном с сайта? Вам нужно указать путь к этим файлам компоновщику через -L<path-to-libs> или просто поместить их в свой LIB, так как он уже есть в вашем makefile. - person igagis; 15.05.2017
comment
Нет, в каталоге src есть только .c и .h. Я проверю это, если это сработает или если я найду решение, я скажу об этом здесь. Спасибо - person Steve Dsp; 16.05.2017
comment
Затем вам нужно добавить эти .c файлы в свой проект, скомпилировать их и связать - person igagis; 16.05.2017