1

MakefileC ライブラリの 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 symbolPython でライブラリをインポートしようとするとエラーが発生します。

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 に渡して、共有オブジェクト ライブラリのローカル バージョンを明示的にリンクするように指示できるオプションはありますか?

4

1 に答える 1

4

問題は-L、ディレクトリを検索パスに追加するだけ-lで、検索パスのどこにでもライブラリが見つかることです。そう:

LIBS = -L./$(EXAMPLE_LIB) -lexample

… を検索する前に、、、 などでlibexample.so(またはlibexample.a!) を検索する場合があります。/usr/lib/usr/local/lib/usr/lib64./example

詳細については、GCC ドキュメントのリンク オプションディレクトリ検索のオプションを参照してください。

ライブラリを明示的に指定する場合は、そのパスをリンカーに渡すだけです。

LIBS = ./$(EXAMPLE_LIB)/libexample.so

ドキュメントが明示的に言うように:

-l オプションを使用する場合とファイル名を指定する場合の唯一の違いは、-l はライブラリを「lib」と「.a」で囲み、いくつかのディレクトリを検索することです。

したがって、複数のディレクトリを検索したくない場合は、使用しないでください-l

于 2013-04-19T19:49:22.047 に答える