1. 문제 소개
프로젝트 요구 사항으로 인해 "컴파일 중에 다른 동적 링크 라이브러리를 참조"하는 파일(main.c)을 동적 링크 라이브러리로 컴파일해야 합니다.
간단히 설명하자면, 원본 프로젝트 코드에는 main.c, usb_hid.c, usb_hid.h의 세 가지 파일이 포함되어 있으며, 일반적으로 컴파일된 실행 파일인 main의 종속성은 다음과 같습니다.
main.o는 libusb 라이브러리에 의존하고, usb_hid.c는 libusb 라이브러리에 의존하며, 실행 파일 main은 컴파일의 처음 두 단계에서 생성된 main.o 및 usb_hid.o에 의존합니다.
해당 makefile은 다음과 같습니다
CC = gcc
CFLAGS = -I . -I /usr/local/include/libusb-1.0 -std=c99
TARGET = main
all: $(TARGET)
main: ./main.o ./usb_hid.o
$(CC) $^ -L/usr/local/lib -lusb-1.0 -o main
rm -rf ./*.o
./main.o: ./main.c
$(CC) $(CFLAGS) -c $< -o $@
./usb_hid.o: ./usb_hid.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf ./*.o
rm -rf ./main
# ----------------------------------------------------------------------------
.PHONY: $(PHONY) clean
2. 문제 해결
이전에는 종속성을 파악하지 못했고 usb_hid 관련 기능을 도입하지 않았으므로 ldd -r libpufmac.so
명령을 사용한 후 다음 오류가 보고됩니다.
OSError: ./libpufmac.so: undefined symbol: usb_index
OSError: ./libpufmac.so: undefined symbol: xxxxx
......
이전 동적 링크 라이브러리 컴파일 경험을 종합하면 올바른 컴파일 명령은 다음과 같습니다. 이 명령으로 컴파일한 후 해당 libpufmac.so가 생성될 수 있으며 위 오류가 다시 발생하지 않습니다.
gcc -shared -fPIC main.c usb_hid.c -o libpufmac.so -L/usr/local/lib -lusb-1.0 -I /usr/local/include/libusb-1.0 -std=c99
-L을 사용하여 해당 동적 링크 라이브러리를 참조한 다음 -I를 사용하여 포함된 헤더 파일의 위치를 지정합니다.