代码之家  ›  专栏  ›  技术社区  ›  eftshift0

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

  •  0
  • eftshift0  · 技术社区  · 4 年前

    https://github.com/eantoranz/gitmod 它被分成单独的c/h文件。在我当前的Makefile中,我将每个c文件编译成它们自己的.o文件,然后当我想创建最终程序时,我要求编译一个c文件,它有一个main并提供所有其他的.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)
    

    这将是使用so替换的此过程的最后2个步骤 gitmod.o 对于 libgitmod.so ,在创建所有以前的.o文件之后:

    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
    

    我做错什么了?

    1 回复  |  直到 4 年前
        1
  •  1
  •   John Park    4 年前

    -fPIC ,这意味着独立于位置的代码,创建共享对象需要标志。 您可以在compile标志中添加标志,然后可以创建共享对象。