【问题标题】:How to merge two static libraries into single shared library如何将两个静态库合并为一个共享库
【发布时间】:2018-11-04 18:21:53
【问题描述】:

作为我学习的一部分,我正在尝试将两个静态库合并到一个共享库中。按照我用来准备静态库的命令序列

$gcc -c mathutil.cpp -o mathutil.o

$ar rcs libmathutil.a mathutil.o

$gcc -c dateutil.cpp -o dateutil.o

$ar rcs libdateutil.a dateutil.o

谁能告诉我如何将这两个静态库合并到一个共享库中。

我试过下面的命令

gcc -Wl,--whole-archive -shared libutil.so libmathutil.a

但它给出了很多多重定义错误。

【问题讨论】:

  • 如果有人发明了一个方便的工具来分享其中的一些错误。要是……
  • 也许您的意思是输入-o libutil.so libmathutil.a libdateutil.a

标签: c++ gcc compilation linker


【解决方案1】:

如果您有源文件,为什么不直接将它们编译到共享库中呢?将-fPIC 标志添加到您的编译行(PIC = 位置独立代码),然后链接类似:

编译文件:

gcc -c -fPIC mathutil.cpp -o mathutil.o
gcc -c -fPIC dateutil.cpp -o dateutil.o

创建共享库:

gcc -shared dateutil.o mathutil.o -o bin/shared/libutil.so

【讨论】:

  • 其实我想了解如何限制共享库中静态库的符号绑定。假设 libmathutil.a 中有一个具有全局绑定的函数 func(),当我将它链接到共享库 libutil.so 中时,我希望 func() 的绑定是本地的。
  • @Pendyala 嗯..好的,那么您检查过 n.m. 的评论,看起来您在链接命令中缺少一个静态库吗?试试看:gcc -shared libutil.so -Wl,--whole-archive libmathutil.a libdateutil.a -Wl,--no-whole-archive。这只是将您的整个存档块仅保留在静态库周围。不确定这是否真的很重要,我没有测试过或阅读过任何建议这样做的东西......
猜你喜欢
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 2011-07-23
相关资源
最近更新 更多