【发布时间】:2014-09-08 04:32:15
【问题描述】:
我有我在 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)
【问题讨论】:
-
您应该使用 $(CC) 进行链接。
-
使用 $(CC) 给了我
clang -l:libmymath.so -o simpleone libmymath.so: undefined reference toint_mul' libmymath.so:未定义引用int_add' clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [simpleone] Error 1
我不明白为什么它说未定义的引用,我链接了将 lib1 和 lib2 相乘并相加。 -
Makefile 完全搞砸了。从哪个文件 .so 创建 - my_add.o、my_mul.o 或 math.o?理论上 - 来自他们所有人,但这不是你写的。
-
所有三个,我运行 lib1,然后运行 lib2,最后运行 lib3。这将每次重新链接(或重建).so 文件,不是吗?
-
不,每次都会用新的结果覆盖.so。
标签: c makefile linker shared-libraries clang