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)