【问题标题】:gcc - how to create an so from a source file and other o files?gcc - 如何从源文件和其他 o 文件创建一个 so?
【发布时间】: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


    【解决方案1】:

    -fPIC,表示Position Indepent Code,创建共享对象需要flags。 您可以在编译标志中添加该标志,然后您可以创建一个共享对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 2015-01-18
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      相关资源
      最近更新 更多