2015-05-21 21 views
5

Pracuję nad projektem, w którym muszę pracować z PicoTCP (patrz https://developer.mbed.org/users/daniele/code/PicoTCP/, używam starszej wersji tej biblioteki). W moim pliku main.cpp, mam następujący kod:Niezdefiniowane odwołanie do pico_dhcp_server_initiate podczas kompilowania PicoTCP do mobblera ARM

#include "pico_stack.h" 
#include "pico_dhcp_server.h" 

int main(void) { 
    // create DHCP server 
    struct pico_dhcpd_settings s = { }; 
    s.my_ip.addr = long_be(0x0a280001); /* 10.40.0.1 */ 
    pico_dhcp_server_initiate(&s); 
} 

Funkcja pico_dhcp_server_initiate jest zadeklarowana pico_dhcp_server.h:

#ifndef _INCLUDE_PICO_DHCP_SERVER 
#define _INCLUDE_PICO_DHCP_SERVER 

#include "pico_dhcp_common.h" 
#include "pico_addressing.h" 

... omitted some declarations ... 

int pico_dhcp_server_initiate(struct pico_dhcpd_settings *setting); 

#endif /* _INCLUDE_PICO_DHCP_SERVER */ 

I ten sposób jest realizowany w pico_dhcp_server.c:

int pico_dhcp_server_initiate(struct pico_dhcpd_settings *setting) 
{ 
    ... 
} 

Podczas kompilowania kodu pojawia się następujący błąd: Undefined reference to pico_dhcp_server_initiate(pico_dhcpd_settings *). Kompiluję plik Makefile, który wygląda tak:

# This file was automagically generated by mbed.org. For more information, 
# see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded 

GCC_BIN = 
PROJECT = networking_driver_test 
OBJECTS = ./mbed-rtos/rtx/TARGET_CORTEX_M/TARGET_M3/TOOLCHAIN_GCC/SVC_Table.o ./mbed-rtos/rtx/TARGET_CORTEX_M/TARGET_M3/TOOLCHAIN_GCC/HAL_CM3.o ./USB_Ethernet/modules/pico_dhcp_common.o ./USB_Ethernet/modules/pico_dhcp_client.o ./USB_Ethernet/modules/pico_http_util.o ./USB_Ethernet/modules/pico_ipfilter.o ./USB_Ethernet/modules/pico_nat.o ./USB_Ethernet/modules/pico_udp.o ./USB_Ethernet/modules/pico_igmp.o ./USB_Ethernet/modules/pico_tcp.o ./USB_Ethernet/modules/pico_simple_http.o ./USB_Ethernet/modules/pico_http_client.o ./USB_Ethernet/modules/pico_icmp4.o ./USB_Ethernet/modules/pico_ipv4.o ./USB_Ethernet/modules/pico_dhcp_server.o ./USB_Ethernet/modules/pico_dev_loop.o ./USB_Ethernet/modules/pico_http_server.o ./USB_Ethernet/modules/pico_dns_client.o ./USB_Ethernet/stack/pico_socket.o ./USB_Ethernet/stack/pico_arp.o ./USB_Ethernet/stack/pico_frame.o ./USB_Ethernet/stack/pico_device.o ./USB_Ethernet/stack/pico_tree.o ./USB_Ethernet/stack/pico_stack.o ./USB_Ethernet/stack/pico_protocol.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_Semaphore.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_Event.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_List.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_Mutex.o ./mbed-rtos/rtx/TARGET_CORTEX_M/HAL_CM.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_Task.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_CMSIS.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_System.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_Time.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_MemBox.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_Robin.o ./mbed-rtos/rtx/TARGET_CORTEX_M/RTX_Conf_CM.o ./mbed-rtos/rtx/TARGET_CORTEX_M/rt_Mailbox.o ./main.o ./USB_Ethernet/USBCDC_ECM.o ./USB_Ethernet/modules/pico_dev_mbed.o ./USB_Ethernet/modules/pico_dev_mbed_usb.o ./USBDevice/USBDevice/USBHAL_RZ_A1H.o ./USBDevice/USBDevice/USBHAL_STM32F4.o ./USBDevice/USBDevice/USBHAL_LPC17.o ./USBDevice/USBDevice/USBHAL_Maxim.o ./USBDevice/USBDevice/USBHAL_LPC11U.o ./USBDevice/USBDevice/USBHAL_LPC40.o ./USBDevice/USBDevice/USBDevice.o ./USBDevice/USBDevice/USBHAL_KL25Z.o ./USBDevice/USBMSD/USBMSD.o ./USBDevice/USBSerial/USBCDC.o ./USBDevice/USBSerial/USBSerial.o ./USBDevice/USBMIDI/USBMIDI.o ./USBDevice/USBHID/USBMouseKeyboard.o ./USBDevice/USBHID/USBKeyboard.o ./USBDevice/USBHID/USBHID.o ./USBDevice/USBHID/USBMouse.o ./USBDevice/USBAudio/USBAudio.o ./mbed-rtos/rtos/Thread.o ./mbed-rtos/rtos/Semaphore.o ./mbed-rtos/rtos/Mutex.o ./mbed-rtos/rtos/RtosTimer.o 
SYS_OBJECTS = ./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/retarget.o ./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/system_LPC17xx.o ./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/board.o ./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/cmsis_nvic.o ./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/startup_LPC17xx.o 
INCLUDE_PATHS = -I. -I./USB_Ethernet -I./USB_Ethernet/modules -I./USB_Ethernet/stack -I./USB_Ethernet/include -I./USB_Ethernet/include/arch -I./USBDevice -I./USBDevice/USBDevice -I./USBDevice/USBMSD -I./USBDevice/USBSerial -I./USBDevice/USBMIDI -I./USBDevice/USBHID -I./USBDevice/USBAudio -I./mbed-rtos -I./mbed-rtos/rtos -I./mbed-rtos/rtx -I./mbed-rtos/rtx/TARGET_CORTEX_M -I./mbed-rtos/rtx/TARGET_CORTEX_M/TARGET_M3 -I./mbed-rtos/rtx/TARGET_CORTEX_M/TARGET_M3/TOOLCHAIN_GCC -I./mbed -I./mbed/TARGET_LPC1768 -I./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM -I./mbed/TARGET_LPC1768/TARGET_NXP -I./mbed/TARGET_LPC1768/TARGET_NXP/TARGET_LPC176X -I./mbed/TARGET_LPC1768/TARGET_NXP/TARGET_LPC176X/TARGET_MBED_LPC1768 
LIBRARY_PATHS = -L./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM 
LIBRARIES = -lmbed 
LINKER_SCRIPT = ./mbed/TARGET_LPC1768/TOOLCHAIN_GCC_ARM/LPC1768.ld 

############################################################################### 
AS  = $(GCC_BIN)arm-none-eabi-as 
CC  = $(GCC_BIN)arm-none-eabi-gcc 
CPP  = $(GCC_BIN)arm-none-eabi-g++ 
LD  = $(GCC_BIN)arm-none-eabi-gcc 
OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy 
OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump 
SIZE = $(GCC_BIN)arm-none-eabi-size 

CPU = -mcpu=cortex-m3 -mthumb 
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer 
CC_FLAGS += -MMD -MP 
CC_SYMBOLS = -DTARGET_LPC1768 -DTARGET_M3 -DTARGET_CORTEX_M -DTARGET_NXP -DTARGET_LPC176X -DTARGET_MBED_LPC1768 -DTOOLCHAIN_GCC_ARM -DTOOLCHAIN_GCC -D__CORTEX_M3 -DARM_MATH_CM3 -DMBED_BUILD_TIMESTAMP=1432213479.57 -D__MBED__=1 

LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main 
LD_FLAGS += -Wl,-Map=$(PROJECT).map,--cref 
LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys 

ifeq ($(DEBUG), 1) 
    CC_FLAGS += -DDEBUG -O0 
else 
    CC_FLAGS += -DNDEBUG -Os 
endif 

all: $(PROJECT).bin $(PROJECT).hex 

clean: 
    rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS) 

.s.o: 
    $(AS) $(CPU) -o [email protected] $< 

.c.o: 
    $(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o [email protected] $< 

.cpp.o: 
    $(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 -fno-rtti $(INCLUDE_PATHS) -o [email protected] $< 


$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) 
    $(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o [email protected] $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS) 
    @echo "" 
    @echo "*****" 
    @echo "***** You must modify vector checksum value in *.bin and *.hex files." 
    @echo "*****" 
    @echo "" 
    $(SIZE) [email protected] 

$(PROJECT).bin: $(PROJECT).elf 
    @$(OBJCOPY) -O binary $< [email protected] 

$(PROJECT).hex: $(PROJECT).elf 
    @$(OBJCOPY) -O ihex $< [email protected] 

$(PROJECT).lst: $(PROJECT).elf 
    @$(OBJDUMP) -Sdh $< > [email protected] 

lst: $(PROJECT).lst 

size: 
    $(SIZE) $(PROJECT).elf 

DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d) 
-include $(DEPS) 

Nie jestem pewien, co powoduje ten błąd. Uważam, że plik .c nie jest skompilowany w jakiś sposób, ale jestem bardzo nowy w składni Makefile. Czy to możliwe, że coś jest nie tak w makefile? Czy ktoś może mi w tym pomóc?

+1

Dla 'DEBUG', możesz wziąć pod uwagę' CC_FLAGS + = -DDEBUG -O1 -g3'. Lub nawet '-Og' na późniejszych wersjach GCC, ponieważ' -Og' służy do przeprowadzenia pewnych analiz bez wpływu na działanie debugowania. '-O1' wywołuje podstawową analizę, a' -g3' dodaje najwięcej informacji debugujących, w tym definicje symboliczne. – jww

+0

To interesujące, zdecydowanie spróbuję! – Devos50

Odpowiedz

1

Znalazłem rozwiązanie. W górnej części pliku .c sprawdzono, czy zdefiniowano stałą PICO_DHCPD_SUPPORT. Nie miało to miejsca, co spowodowało, że mój plik .c nie został skompilowany, a zatem nie można było znaleźć implementacji tej funkcji. Dodanie tej flagi do ustawienia CC_FLAGS w pliku Makefile rozwiązało problem.

5

Błąd, który otrzymujesz, nie jest błędem kompilatora, ale błędem linkera. Narzeka, że ​​nie znajduje symboli funkcji znajdujących się w bibliotece picoTCP, z którymi nie łączysz. Musisz dodać -l<picoTCPlibGoesHere> i -L<path to pico TCP lib goes here> Nie wiem, jakie są nazwy tej biblioteki, ale powinna ona mieć nazwę lib.a. Gdy użyjesz go z flagą -l, opuść bibliotekę i .a. Na przykład, jeśli biblioteka ma nazwę libpicotcp.a, flaga będzie -lpicotcp. Musisz dodać flagę -l do swojej biblioteki LIBRARIES i -L do LIBRARY_PATHS w pliku Makefile.

+0

Dziękuję za odpowiedź. Jedyny plik .a, który widzę, to biblioteka libmbed.a, która nie zawiera wymaganych plików. Pliki źródłowe pico znajdują się w katalogu 'USB_ethernet/modules'. Ponadto widzę na wyjściu mojego kompilatora, że ​​kompiluje się 'pico_dhcp_server.c'. Jakieś inne pomysły? – Devos50

+0

Być może trzeba będzie skompilować bibliotekę picoTCP. – rost0031

+0

Ale inne pliki źródłowe używają pico, a gdy skomentuję linię, która daje błąd, wszystko działa dobrze. Ponadto, gdy wywołuję funkcję z klasy 'pico_dhcp_client.h', działa to, co jest naprawdę dziwne. Dopiero po wywołaniu funkcji z klasy 'pico_dhcp_server.h', spowoduje to błąd kompilatora. – Devos50