2016-02-19 1 views
0

J'essaie d'ajouter la bibliothèque math.h dans un projet C sur Eclipse IDE pour C/C++. Je travaille actuellement sur windows. Chaque fois que j'essaie de compiler, j'obtiens l'erreur, une référence non définie à 'floor' et une référence indéfinie à 'pow'.Comment lier Eclipse Project avec la bibliothèque -lm pour les fonctions "floor" et "pow"?

J'ai essayé de trouver des solutions qui me disent d'aller dans Projet -> Propriétés -> C/C++ Build -> Settings.

Mais à partir de là, je n'ai aucun onglet d'outil ou une option de lien. Je n'ai que l'onglet "ToolChains", "Devices", "Parsers binaires" et "Error Parsers".

Alors où et comment lier l'option -lm afin de compiler le projet?

Mise à jour:

Le Makefile est la suivante:

PROJECT_NAME := blinky_blank_pca10036 

export OUTPUT_FILENAME 
#MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) 
MAKEFILE_NAME := $(MAKEFILE_LIST) 
MAKEFILE_DIR := $(dir $(MAKEFILE_NAME)) 

TEMPLATE_PATH = ../../../../../../components/toolchain/gcc 
ifeq ($(OS),Windows_NT) 
include $(TEMPLATE_PATH)/Makefile.windows 
else 
include $(TEMPLATE_PATH)/Makefile.posix 
endif 

MK := mkdir 
RM := rm -rf 

#echo suspend 
ifeq ("$(VERBOSE)","1") 
NO_ECHO := 
else 
NO_ECHO := @ 
endif 

# Toolchain commands 
CC    := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-gcc' 
AS    := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-as' 
AR    := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ar' -r 
LD    := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ld' 
NM    := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-nm' 
OBJDUMP   := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objdump' 
OBJCOPY   := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objcopy' 
SIZE   := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-size' 

#function for removing duplicates in a list 
remduplicates = $(strip $(if $1,$(firstword $1) $(call remduplicates,$(filter-out $(firstword $1),$1)))) 

#source common to all targets 
C_SOURCE_FILES += \ 
../../../../../../components/toolchain/system_nrf52.c \ 
../../../main.c \ 
../../../../../../components/drivers_nrf/delay/nrf_delay.c \ 

#assembly files common to all targets 
ASM_SOURCE_FILES = ../../../../../../components/toolchain/gcc/gcc_startup_nrf52.s 

#includes common to all targets 
INC_PATHS = -I../../../../../../components/toolchain/gcc 
INC_PATHS += -I../../../../../../components/toolchain 
INC_PATHS += -I../../.. 
INC_PATHS += -I../../../../../bsp 
INC_PATHS += -I../../../../../../components/device 
INC_PATHS += -I../../../../../../components/drivers_nrf/delay 
INC_PATHS += -I../../../../../../components/drivers_nrf/hal 

OBJECT_DIRECTORY = _build 
LISTING_DIRECTORY = $(OBJECT_DIRECTORY) 
OUTPUT_BINARY_DIRECTORY = $(OBJECT_DIRECTORY) 

# Sorting removes duplicates 
BUILD_DIRECTORIES := $(sort $(OBJECT_DIRECTORY) $(OUTPUT_BINARY_DIRECTORY) $(LISTING_DIRECTORY)) 

#flags common to all targets 
CFLAGS = -DCONFIG_GPIO_AS_PINRESET 
CFLAGS += -DBOARD_PCA10036 
CFLAGS += -DNRF52 
CFLAGS += -DBSP_DEFINES_ONLY 
CFLAGS += -mcpu=cortex-m4 
CFLAGS += -mthumb -mabi=aapcs --std=gnu99 
CFLAGS += -Wall -Werror -O0 -g3 
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 
# keep every function in separate section. This will allow linker to dump unused functions 
CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing 
CFLAGS += -fno-builtin --short-enums 

# keep every function in separate section. This will allow linker to dump unused functions 
LDFLAGS += -Xlinker -Map=$(LISTING_DIRECTORY)/$(OUTPUT_FILENAME).map 
LDFLAGS += -mthumb -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT) 
LDFLAGS += -mcpu=cortex-m4 
LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 
# let linker to dump unused sections 
LDFLAGS += -Wl,--gc-sections 
# use newlib in nano version 
LDFLAGS += --specs=nano.specs -lc -lnosys 

# Assembler flags 
ASMFLAGS += -x assembler-with-cpp 
ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET 
ASMFLAGS += -DBOARD_PCA10036 
ASMFLAGS += -DNRF52 
ASMFLAGS += -DBSP_DEFINES_ONLY 
#default target - first one defined 
default: clean nrf52832_xxaa 

#building all targets 
all: clean 
    $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e cleanobj 
    $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e nrf52832_xxaa 

#target for printing all targets 
help: 
    @echo following targets are available: 
    @echo nrf52832_xxaa 


C_SOURCE_FILE_NAMES = $(notdir $(C_SOURCE_FILES)) 
C_PATHS = $(call remduplicates, $(dir $(C_SOURCE_FILES))) 
C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILE_NAMES:.c=.o)) 

ASM_SOURCE_FILE_NAMES = $(notdir $(ASM_SOURCE_FILES)) 
ASM_PATHS = $(call remduplicates, $(dir $(ASM_SOURCE_FILES))) 
ASM_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(ASM_SOURCE_FILE_NAMES:.s=.o)) 

vpath %.c $(C_PATHS) 
vpath %.s $(ASM_PATHS) 

OBJECTS = $(C_OBJECTS) $(ASM_OBJECTS) 

nrf52832_xxaa: OUTPUT_FILENAME := nrf52832_xxaa 
nrf52832_xxaa: LINKER_SCRIPT=blinky_gcc_nrf52.ld 
nrf52832_xxaa: $(BUILD_DIRECTORIES) $(OBJECTS) 
    @echo Linking target: $(OUTPUT_FILENAME).out 
    $(NO_ECHO)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 
    $(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e finalize 

## Create build directories 
$(BUILD_DIRECTORIES): 
    echo $(MAKEFILE_NAME) 
    $(MK) [email protected] 

# Create objects from C SRC files 
$(OBJECT_DIRECTORY)/%.o: %.c 
    @echo Compiling file: $(notdir $<) 
    $(NO_ECHO)$(CC) $(CFLAGS) $(INC_PATHS) -c -o [email protected] $< 

# Assemble files 
$(OBJECT_DIRECTORY)/%.o: %.s 
    @echo Compiling file: $(notdir $<) 
    $(NO_ECHO)$(CC) $(ASMFLAGS) $(INC_PATHS) -c -o [email protected] $< 


# Link 
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(BUILD_DIRECTORIES) $(OBJECTS) 
    @echo Linking target: $(OUTPUT_FILENAME).out 
    $(NO_ECHO)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 


## Create binary .bin file from the .out file 
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 
    @echo Preparing: $(OUTPUT_FILENAME).bin 
    $(NO_ECHO)$(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin 

## Create binary .hex file from the .out file 
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 
    @echo Preparing: $(OUTPUT_FILENAME).hex 
    $(NO_ECHO)$(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 

finalize: genbin genhex echosize 

genbin: 
    @echo Preparing: $(OUTPUT_FILENAME).bin 
    $(NO_ECHO)$(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin 

## Create binary .hex file from the .out file 
genhex: 
    @echo Preparing: $(OUTPUT_FILENAME).hex 
    $(NO_ECHO)$(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 

echosize: 
    [email protected] '' 
    $(NO_ECHO)$(SIZE) $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 
    [email protected] '' 

clean: 
    $(RM) $(BUILD_DIRECTORIES) 

cleanobj: 
    $(RM) $(BUILD_DIRECTORIES)/*.o 

flash: $(MAKECMDGOALS) 
    @echo Flashing: $(OUTPUT_BINARY_DIRECTORY)/$<.hex 
    nrfjprog --erasepage 0x0-0x80000 -f nrf52 
    nrfjprog --program $(OUTPUT_BINARY_DIRECTORY)/$<.hex -f nrf52 
    nrfjprog --reset 

## Flash softdevice 

Répondre

2

dans Eclipse:

click menu item: `Project' 
    (opens pull down menu) 

click pulldown item: `Properties` 
    (opens `Properties` window) 

If `Properties` is grayed, then make trivial edit to program, like adding a space 

in `Properties` window: 
    click left tab: `C/C++Build` 
     (opens sub tabs) 

    click sub tab: `Settings` 
     (opens `Settings` window) 

in `Settings` window: 
    (if not using gcc, the following may be slightly different) 
    click `GCC CLinker` 
     (opens sub tabs) 
     click sub tab: `Libraries` 

in third column (Libraries) 
    click the left most icon `add` 
     (located to the right of the text: `Libraries (-l)` 
     (opens `Enter Value` window) 

In the `Enter Value` window 
    type `m` 
    click `ok` 

if, below the text: `Library search path (-L)` 
the path `/usr/lib` is NOT listed, then: 

    click the left most icon (add) 
    (located to the right of the text: `Library search path (-L)`) 
    (opens the `Add Directory Path` window) 

in the `Add directory path` window 
    (under the text `Directory:`) 
    type in: `/usr/lib` 
    click `ok` 

click `ok` 

to test: 
    in Eclipse: 
    click `Project` 
     (opens a pull down menu) 
     click `Build All` 

mise en garde: Je suis en cours d'exécution Eclipse sous Linux, de sorte que les détails peuvent être légèrement différentes si vous exécutez MAC-X ou Windows ou utilisez un autre compilateur/éditeur de liens

+0

Dans l'onglet Arrangements, il n'y a pas d'option pour GCC mâchefer. –

+0

Je suis sûr que j'ai mentionné, dans ma réponse, que si vous utilisez un autre compilateur que les onglets seraient différents, Si aucun onglet CLinker, alors peut avoir à placer le chemin de bibliothèque et les éléments de nom de bibliothèque dans – user3629249

+0

dans Eclipse, dans la fenêtre 'project/properties' de l'onglet de gauche' C/C++ Build' (quand il est ouvert) se trouve l'onglet: 'Tool Chain Editor' cliquez dessus. dans la sous-fenêtre de l'éditeur de chaîne d'outils, sous la ligne: 'Afficher uniquement les chaînes d'outils compatibles ', vous pouvez sélectionner la chaîne d'outils (j'ai' Linux GCC ') Quelle est votre sélection? et ce qui est sélectionné dans ce qui suit: 'Constructeur actuel:' ligne? – user3629249

1

Il semble que vous utilisiez Makefiles, si c'est le cas, vous devez modifier le Makefile pour ajouter -lm à la ligne de commande de l'éditeur de liens. Il est important que cela soit placé après tous les objets qui utilisent des fonctions mathématiques.

Avec question mise à jour, y compris le contenu Makefile Je vous suggère de changer:

LDFLAGS += --specs=nano.specs -lc -lnosys 

à

LDFLAGS += --specs=nano.specs -lc -lnosys -lm 
LIBS += -lc -lnosys -lm 
+0

J'ai le MakeFile suivant. Pouvez-vous s'il vous plaît me dire où je dois ajouter l'option -lm. –

+0

@AhmadShah Je ne vois pas de fichier makefile, pouvez-vous l'ajouter à votre question? N'oubliez pas de vérifier la mise en forme afin qu'elle semble correcte à l'écran dans la question. –

+0

Désolé mais la modification des lignes LDFLAGS (comme mentionné ci-dessus) n'a aucun effet. Cela dit encore une référence indéfinie à pow/floor. P.S: J'ai inclus la bibliothèque math.h dans le fichier principal, donc il n'y a pas de problème. –