Makefile
C ライブラリの Python ラッパーをコンパイルするためのセットアップに取り組んでいます。ファイルの内容は次のとおりです (ライブラリ名は infosec の理由で変更されています)。行番号は参照用であり、ファイル データ自体には含まれません。
1 CC = gcc
2 CFLAGS = -Wall -fPIC -shared
3 EXAMPLE_LIB = example
4 PYTHON = /usr/include/python2.6
5 LIBS = -L./$(EXAMPLE_LIB) -lexample
6 INCLUDE = -I./$(EXAMPLE_LIB)/include -I$(PYTHON)
7 DEPS = test.h
8 OBJ = test.o
9 SHARED = test.so
10
11 .PHONY : build
12
13 all: build $(SHARED)
14
15 build:
16 ./$(EXAMPLE_LIB)/config shared
17 $(MAKE) -C $(EXAMPLE_LIB)
18
19 %.o: %.c $(DEPS)
20 $(CC) $(CFLAGS) $(INCLUDE) -c -o $@ $<
21
22 $(SHARED): $(OBJ)
23 $(CC) $(CFLAGS) $(LIBS) -o $@ $+
24
25 clean:
26 $(MAKE) clean -C $(EXAMPLE_LIB)
27 rm $(OBJ)
28 rm $(SHARED)
EXAMPLE_LIB
共有オブジェクト ファイルexample.so
は正しくコンパイルされ、 に存在し<project-directory>/example/example.so
、サード パーティ ライブラリの適切なヘッダー ファイルは に存在します<project-directory>/example/include
。
私が抱えている問題は、example.so
共有オブジェクト ライブラリの別のバージョン (機能が少ない) がグローバル システムにインストールされておりtest.so
、ローカル (自己コンパイル) コピーではなく、私のライブラリ ( ) にリンクされていることです。これにより、undefined symbol
Python でライブラリをインポートしようとするとエラーが発生します。
test.so
を使用して共有オブジェクト ライブラリを確認すると、ではなく がロードされていることがldd
わかります。またはデモンストレーションするには:/usr/lib64/example.so.1
<project-directory>/example/example.so
[mike@tester myproject]$ ldd test.so
linux-vdso.so.1 => (0x00007fff803ff000)
example.so.1 => /usr/lib64/example.so.1 (0x00007f98700e8000)
libc.so.6 => /lib64/libc.so.6 (0x00007f986fd55000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f986fb50000)
libz.so.1 => /lib64/libz.so.1 (0x00007f986f93a000)
/lib64/ld-linux-x86-64.so.2 (0x0000003afda00000)
GCC に渡して、共有オブジェクト ライブラリのローカル バージョンを明示的にリンクするように指示できるオプションはありますか?