다른 so 라이브러리를 참조하여 Linux에서 so 라이브러리를 생성하는 파일 문제를 해결하는 방법

기사 디렉토리

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를 사용하여 포함된 헤더 파일의 위치를 ​​지정합니다.

추천

출처blog.csdn.net/weixin_46841376/article/details/133486931