2016-12-07 3 views
1

Ich wurde einige Beispielcode von einem Anbieter, der auf libusb beruht, gegeben. Ich erhalte diese, wenn ich versuche machen, um zu kompilieren mit:Undefinierter Verweis auf libusb Funktionen

mkdir -p .obj 
gcc -I./ -I../libsoccptp/include -std=gnu++11 -pthread -g -o .obj/authentication.o -c authentication.cpp -lusb-1.0 -lusb 
gcc -std=gnu++11 -pthread -g -o ../out/bin/authentication .obj/authentication.o -L../out/lib -lsoccptp -L/usr/lib -lusb-1.0 -lstdc++ -lusb-1.0 -lusb 
../out/lib/libsoccptp.so: undefined reference to `libusb_has_capability' 
../out/lib/libsoccptp.so: undefined reference to `libusb_hotplug_register_callback' 
../out/lib/libsoccptp.so: undefined reference to `libusb_handle_events_timeout_completed' 
../out/lib/libsoccptp.so: undefined reference to `libusb_hotplug_deregister_callback' 
collect2: error: ld returned 1 exit status 
Makefile:28: recipe for target '../out/bin/authentication' failed 
make: *** [../out/bin/authentication] Error 1 

Ich habe festgestellt, viele andere Beiträge von Menschen mit ähnlichen Problemen Libusb immer richtig zu verknüpfen. Aber es scheint, als ob die Lösung für andere nur dafür sorgt, dass -lusb-1.0 und -lusb als Argumente für den Compiler hinzugefügt werden. Offensichtlich hat mein Verkäufer das Makefile bereits eingerichtet, um genau das zu tun. Ich habe auch verifiziert, dass ich die neueste Version von libusb-1.0 auf Ubuntu habe, die angeblich die gleiche Umgebung ist, die mein Anbieter verwendet.

Warum wird nicht richtig verlinkt?

als Referenz, hier ist das Makefile:

ROOT_DIR ?= .. 
OUT ?= ../out 
OUT_DIR := $(OUT)/bin 
CC := gcc 

LIBS := -L${OUT}/lib -lsoccptp -L/usr/lib -lusb-1.0 -lstdc++ 

override INCLUDES += -I./ -I${ROOT_DIR}/libsoccptp/include 

.PHONY: clean 

OBJ_DIR := .obj 
SOURCES := authentication.cpp shoot_an_image_and_get_it.cpp check_LiveView_status_and_get_images.cpp parser_handling.cpp list_objects.cpp change_camera_setting.cpp 
OBJECTS := $(addprefix $(OBJ_DIR)/, $(notdir $(SOURCES:.cpp=.o))) 
TARGETS := $(addprefix ${OUT_DIR}/, $(notdir $(basename ${SOURCES}))) 

all: ${OUT_DIR} $(OBJ_DIR) ${TARGETS} 

objs: $(OBJ_DIR) $(OBJECTS) 

$(OBJ_DIR)/%.o : %.cpp 
    $(CC) $(INCLUDES) -std=gnu++11 -pthread -g -o [email protected] -c $< -lusb-1.0 -lusb 

$(OUT_DIR)/%: $(OBJ_DIR)/%.o 
    ${CC} -std=gnu++11 -pthread -g -o [email protected] $< ${LIBS} -lusb-1.0 -lusb 

${OUT_DIR}: 
    mkdir -p ${OUT_DIR} 

$(OBJ_DIR): 
    mkdir -p $(OBJ_DIR) 

clean: 
    rm -rf ${TARGETS} $(OBJ_DIR) 

Antwort

1

Nach einer Diskussion mit einem Ingenieure aus dem Anbieter, der die Software zur Verfügung gestellt, es wurde festgestellt, dass ich eine neuere Version von Ubuntu wurde mit (v16), dann hatten sie entwickelt die Software an. Als ich die ältere Version (v14) kompiliert habe, hat es sich gut kompiliert.

Der Ingenieur war nicht in der Lage zu erklären, was in Ubuntu 16 geändert wurde, das ihren Code brach, aber das löste das Problem für mich jetzt.

Verwandte Themen