【发布时间】:2020-08-17 04:03:14
【问题描述】:
我正在做一个 c 项目。 https://github.com/eantoranz/gitmod 它被分解成单独的 c/h 文件。在我当前的 Makefile 中,我获取每个 c 文件并将它们编译成自己的 .o 文件,然后当我想创建最终程序时,我要求编译具有 main 的 ac 文件并提供所有其他 .o文件。到目前为止,一切都很好(如果这种方法不正确,请告诉我)。
下一步,我想将程序的主要部分与所有其他代码片段分开,并希望将所有以前的 o 文件打包到一个 so 文件中(该文件已被编译为另一个.o 文件)。
所以,旧方法是这样的:
gitmod.o: src/gitmod.c include/gitmod.h lock.o root_tree.o thread.o object.o cache.o
$(CC) -c -o $@ $< $(CFLAGS)
gitmod: src/main.c gitmod.o
$(CC) $< *.o -o $@ $(CFLAGS)
在创建所有以前的 .o 文件之后,这些将是此过程的最后 2 个步骤,使用 so 将 gitmod.o 替换为 libgitmod.so:
libgitmod.so: src/gitmod.c include/gitmod.h lock.o root_tree.o thread.o object.o cache.o
$(CC) $< *.o -shared -o $@ $(CFLAGS)
gitmod: src/main.c libgitmod.so
$(CC) $< -llibgitmod.so -o $@ $(CFLAGS)
libgitmod.so 将是我希望实际包含所有其他代码部分的共享库(我真的希望这是可能的)。
当make 经历libgitmod.so 时,我得到这个:
gcc src/gitmod.c *.o -shared -o libgitmod.so -Iinclude `pkg-config fuse3 libgit2 glib-2.0 --cflags --libs` -DGITMOD_DEBUG -Wall -g
/usr/bin/ld: object.o: warning: relocation against `stderr@@GLIBC_2.2.5' in read-only section `.text'
/usr/bin/ld: /tmp/ccir4Ou9.o: relocation R_X86_64_PC32 against symbol `stderr@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make: *** [Makefile:32: libgitmod.so] Error 1
我做错了什么?
【问题讨论】:
标签: c makefile linker shared-libraries