c++ - 静态编译共享库

标签 c++ c static linker shared-libraries

我有一个带有一些自制函数的共享库,我将其编译到我的其他程序中,但我必须将最终程序与我用来编译静态库的所有库链接起来。这是一个例子:

我在库中有函数 foo,它需要来自另一个库 libbar.so 的函数。

在我的主程序中使用函数 foo 我必须用 -lbar 标志编译它。有没有一种方法可以静态编译 my 库,以便它包含来自其他库的所有必需代码,并且我可以在不需要 -lbar 标志的情况下编译我的最终程序?

最佳答案

共享对象 (.so) 不是库,而是对象。您不能提取其中的一部分并将其插入其他库。

如果构建一个引用另一个的共享对象,您可以做什么——但在运行时将需要另一个。只需在链接 libfoo 时添加 -lbar。

如果你能够构建 libbar,你显然可以创建一个库,它是 libfoo 和 libbar 的组合。 IIRC,您还可以通过将 .a 与 .o 链接到 libbar 来使链接器构建一个库,该库是 libfoo 和 libbar 的所需部分。示例:

gcc -fPIC -c lib1.c     # define foofn(), reference barfn1()
gcc -fPIC -c lib2a.c    # define barfn1(), reference barfn2()
gcc -fPIC -c lib2b.c    # define barfn2()
gcc -fPIC -c lib2c.c    # define barfn3()
gcc -c main.c           # reference foofn()
ar -cru libbar.a lib2*.o
gcc -shared -o libfoo.so lib1.o -L. -lbar
nm libfoo.so | grep barfn2()    # ok, not here
gcc -o prog main.o -L. -lfoo
env LD_LIBRARY_PATH=. ./prog    # works, so foofn(), barfn1() and barfn2() are found

关于c++ - 静态编译共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2812079/

相关文章:

c++ - QPlainTextEdit - 搜索文档到最后,然后再从头开始

c++ - 在派生类中调用父类的paint事件?

c++ - Visual C++ 2012 项目模板中的自定义参数

c - 与 mkl_malloc 的内存对齐

我可以使用 &array[0][0][0] 传递声明为 double ***array 的 3D 数组吗?

类中的 C++ 静态成员

c++ - 使用getline时哪种方式更好?

c - C中()的(void)是什么

generics - TypeScript:继承类中方法的自引用返回类型

oop - Matlab相当于调用内部静态类