2016-02-19 83 views
0

我正在尝试在C/C++的Eclipse IDE上的C项目中添加math.h库。我目前正在研究Windows。如何将Eclipse Project与-lm库链接到“floor”和“pow”函数?

每当我尝试编译,我得到错误,未定义的引用'楼'和未定义的引用'pow'。

我试着找出解决方案,告诉我去项目 - >属性 - > C/C++编译 - >设置。

但是从那里,我没有任何工具选项卡或链接器选项。我只有“ToolChains”,“Devices”,“Binary Parsers”和“Error Parsers”选项卡。

那么我在哪里以及如何链接-lm选项以使项目编译?

更新:

的Makefile文件如下:

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 

回答

2
在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` 

警告:我在Linux中运行Eclipse,所以细节可能会略有不同如果您运行的是MAC-XWindows或使用不同的编译器/链接器

+0

在Setings标签,对于GCC熟料别无选择。 –

+0

我确定我在回答中提到,如果使用不同的编译器以使选项卡不同,如果没有'CLinker'选项卡,则可能必须将库路径和库名称项放置在Eclipse的 – user3629249

+0

中,在左侧选项卡C/C++ Build(在打开时)的'project/properties'窗口中是tab:'Tool Chain Editor'点击它。在下面的工具链编辑器子窗口中:'仅显示兼容的工具链',您可以选择哪个工具链(我有'Linux GCC')您的选择是什么?以及以下选择的内容:“当前生成器:”行? – user3629249

1

听起来好像你正在使用Makefiles,如果是这样,你需要编辑Makefile以将-lm添加到链接器命令行。将它放在任何使用数学函数的对象之后是很重要的。

有了更新的问题,包括Makefile内容我可以建议你改变:

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

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

我有以下的MakeFile。你可以告诉我,我必须在哪里添加-lm选项。 –

+0

@AhmadShah我看不到任何生成文件,你可以将它添加到你的问题?请记住检查格式,以便在问题的屏幕上看起来正确。 –

+0

对不起,但更改LDFLAGS行(如上所述)不起作用。它仍然说未定义的参考pow/floor。 P.S:我在主文件中包含了math.h库,所以这里没有问题。 –