Linux でファイル生成 so ライブラリが別の so ライブラリを参照する問題を解決する方法

記事ディレクトリ

1. 問題の概要

プロジェクトの要件により、「コンパイル中に別のダイナミック リンク ライブラリを参照する」ファイル (main.c という名前) をダイナミック リンク ライブラリにコンパイルする必要があります。

簡単に説明すると、元のプロジェクト コードには main.c、usb_hid.c、usb_hid.h の 3 つのファイルが含まれており、通常にコンパイルされた実行可能ファイル main の依存関係は次のとおりです。

main.o は libusb ライブラリに依存し、usb_hid.c は libusb ライブラリに依存し、実行可能ファイル main はコンパイルの最初の 2 つのステップで生成された main.o と usb_hid.o に依存します。

対応するメイクファイルは以下の通り

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