gcc - 如何从源文件和其他 o 文件创建 so?

gcc - how to create an so from a source file and other o files?

我正在做一个 c 项目。 https://github.com/eantoranz/gitmod 它被分解成单独的 c/h 文件。在我当前的 Makefile 中,我将每个 c 文件编译成它们自己的 .o 文件,然后当我想创建最终程序时,我要求编译一个具有 main 并提供所有其他 .o 的 c 文件文件。到目前为止,一切顺利(如果这种方法不正确,请告诉我)。

作为下一步,我想将程序的主要部分与所有其他代码片段分开,并想将所有以前的 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 文件后,这些将是使用 so 替换 gitmod.o 代替 libgitmod.so 的过程的最后 2 个步骤:

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

我做错了什么?

-fPIC,表示Position Indepent Code,创建共享对象需要flags。 可以在compile flag中加上flag,然后就可以创建共享对象了。