Python 显式链接本地共享对象库

Python 显式链接本地共享对象库,python,c,gcc,makefile,centos6,Python,C,Gcc,Makefile,Centos6,我正在建立一个Makefile,用于为C库编译Python包装。文件内容如下(由于信息安全原因更改了库名称)。行号仅供参考,不包含在文件数据本身中 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 INCL

我正在建立一个
Makefile
,用于为C库编译Python包装。文件内容如下(由于信息安全原因更改了库名称)。行号仅供参考,不包含在文件数据本身中

  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)

我是否可以向GCC传递一个选项,告诉它显式链接共享对象库的本地版本?

问题是
-L
只是向搜索路径添加一个目录,而
-L
只是在搜索路径上的任何位置查找库。因此:

LIBS = -L./$(EXAMPLE_LIB) -lexample
…在查看
/example
之前,可能会在
/usr/lib
/usr/local/lib
/usr/lib64
等中查找
libexample.so
(或
libexample.a
!)

有关详细信息,请参阅GCC文档中的和

如果要显式指定库,只需将其路径传递给链接器:

LIBS = ./$(EXAMPLE_LIB)/libexample.so
正如文件明确指出的那样:

使用-l选项和指定文件名之间的唯一区别是-l用“lib”和“.a”包围库,并搜索多个目录


因此,如果您不希望它搜索多个目录,请不要使用
-l

问题是
-l
只是将一个目录添加到搜索路径,而
-l
只是在搜索路径上的任意位置查找库。因此:

LIBS = -L./$(EXAMPLE_LIB) -lexample
…在查看
/example
之前,可能会在
/usr/lib
/usr/local/lib
/usr/lib64
等中查找
libexample.so
(或
libexample.a
!)

有关详细信息,请参阅GCC文档中的和

如果要显式指定库,只需将其路径传递给链接器:

LIBS = ./$(EXAMPLE_LIB)/libexample.so
正如文件明确指出的那样:

使用-l选项和指定文件名之间的唯一区别是-l用“lib”和“.a”包围库,并搜索多个目录


因此,如果您不希望它搜索多个目录,请不要使用
-l

我对GCC的理解不是特别强。在上面的示例中,是否可以将
LIBS=-L./$(示例库)-lexample
更改为
LIBS=./$(示例库)/libexample。那么
或者我需要使用哪个选项?是的,这正是我的意思。抱歉没有说清楚。希望编辑后的答案更好?在我的特殊情况下,我仍然有链接问题,但这个答案似乎解释了我问题的症结所在。我对GCC的理解不是特别强。在上面的示例中,是否可以将
LIBS=-L./$(示例库)-lexample
更改为
LIBS=./$(示例库)/libexample。那么
或者我需要使用哪个选项?是的,这正是我的意思。抱歉没有说清楚。希望编辑后的答案更好?在我的特殊情况下,我仍然存在链接问题,但这个答案似乎解释了我问题的症结所在。