将.so文件链接到可执行文件中

时间:2014-09-08 04:32:15

标签: c makefile linker shared-libraries clang

我有一个目标代码,我在clang中使用-fPIC开关编译,也使用了-shared开关。然后我将所有这些链接到一个.so共享对象。现在我想将它链接到一个可执行文件中,我在手册页中告诉我应该可以使用 ld命令和-l开关。但是当我这样做时,我收到以下错误:


ld -r -L./ -l:libmymath.so simpleone
ld: attempted static link of dynamic object `libmymath.so'
make: *** [simpleone] Error 1


我试过用-dy开关做同样的事情,但它给了我同样的错误。 我真的不明白为什么这不起作用。

这是我用来完成所有这些的makefile。

CC= clang 
LD= ld -r
CFLAGS= -std=gnu99 -g -Oz -c 
CSECFL= -fPIC -I -L 
CFLAG3= -shared
RM= /bin/rm -f
OBJ= math.o my*.o
SO= libmymath.so

all: math my_add my_mul 

math: math.c
    $(CC) $(CFLAGS) $@.c $(CSECFL)

my_add: my_add.c
    $(CC) $(CFLAGS) $@.c $(CSECFL)

my_mul: my_mul.c
    $(CC) $(CFLAGS) $@.c $(CSECFL)

simplemath: $(OBJ)
    $(CC) $(OBJ) -o $@ 

simplemath.o: $(OBJ)
    $(LD) $(OBJ) -o $@

lib1: my_add.o
    $(CC) $(CFLAG3) my_add.o -o $(SO)

lib2: $(OBJ)
    $(CC) $(CFLAG3) my_mul.o -o $(SO)

lib3: $(OBJ)
    $(CC) $(CFLAG3) math.o -o $(SO)

simpleone: $(OBJ)
    $(LD) -L./ -l:libmymath.so $@

clean:
    $(RM) *.o simplemath* *.t $(SO)

1 个答案:

答案 0 :(得分:1)

您需要将对象(* .o)链接到静态可执行文件,而不是共享库(.so).so可以由运行时动态链接器或通过dlopen()调用打开。