2017-05-15 1 views
0

Je travaille sur un projet, codant en C++, pour développer une communication Modbus sur TCP/IP entre un Raspberry pi et un Arduino.Comment ajouter une compilation de bibliothèque (en-tête + .c) dans MakeFile (Eclipse)?

J'ai un exemple basique de "hello world" qui fonctionne dans Raspberry. Je souhaite ajouter la bibliothèque libmodbus (fichiers .h et .c) dans mon projet Eclipse et tester un test d'unité de serveur fourni. J'ai déjà ajouté le répertoire dans "Chemin et symbole" (GNU C et GNU C++) et le "inclus".

Dans le MakeFile, j'ai ajouté le répertoire de la section du fichier libmodbus (#Include paths). Lorsque je compile le projet, seuls les fichiers .h sont compilés, pas le fichier .c. Le "modbus.h" est reconnu, mais ils sont des erreurs comme « undefined reference to .... (modbus) fonctions.

J'ai testé de nombreuses solutions, mais il ne fonctionne pas encore.

Merci à . avance

################################################################################ 
# 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: [email protected]' 
    $(CC) $(OBJS_MAIN) [email protected] $(LDFLAGS) $(LDADDLIBS) 

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

# File compiling: Main Programs ------------------------------------------------ 
$(OBJPATH)/%.cpp.o: $(MAIN_HOME)/%.cpp 
    $(ECHO) 'Building file: $<' 
    $(CXX) -c $(CPPFLAGS) [email protected] $< 
#=============================================================================== 
# 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' 

Répondre

0

Vous devez probablement ajouter à votre -lmodbusLDADDLIBS variable:.

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

Merci, j'ajouté cette ligne, mais cela ne fonctionne pas 'ne peut pas trouver -lmodbus' –

+0

Vérifiez qu'il y a 'libmodbus.so' dans'/usr/lib' – igagis

+0

Non, je n'ai pas 'libmodbus.so' n'importe où. Je viens de télécharger les fichiers libmodbus sur le site officiel –