c++ - 相互依赖的静态库
问题描述
所以假设我有两个静态构建的库。libFoo.a 和 libBar.a。
libFoo.a 使用来自 libBar.a 的函数,而 libBar.a 也恰好使用来自 libFoo.a 的函数。
现在,让我们创建一个使用 libFoo 和 libBar 的程序 baz.cpp。通常,您会键入:
g++ baz.cpp -lfoo -lbar
然而,因为这两个静态库相互使用......嗯,对于如何让编译时链接器接受这种情况并将它们链接在一起,我没有明显的解决方案。
这甚至是 C++ 标准所允许的明智和允许的事情吗?如果是这样,是否有一种非hacky的方法来处理这个问题?
还是首选方法是将 libBar 和 libFoo 中的所有目标文件一起编译到一个静态库中?
解决方案
有两种替代解决方案:
- 重复库名称:
-lfoo -lbar -lfoo
. - 使用链接器组:
-Wl,--start-group -lfoo -lbar -Wl,--end-group
重复库名称的效果是链接器将库扔到当前未定义的符号处并解析它可以解析的所有内容,因此通过再次提及一个库,它将解析所有先前库中的符号。这总是可以用来打破所有的循环。
链接器组的效果在于它有效地改变了链接器算法:它首先将组中的所有目标文件和库放入一个错误篮子,然后尝试解决所有问题(无论链接器组内的顺序如何),然后继续下一组。
推荐阅读
- php - 如何在表格中使用 php 生成指向图像的链接
- google-cloud-platform - 在 gcp 云 shell 上运行代码服务器在预览时会出错
- javascript - 我正在运行一个基本的 HTML 和 Javascript 应用程序(连接到 Google 和 Twilio API),并且不断收到未定义变量的引用错误
- html - JQuery 读取旧版本的文件
- javascript - 自定义配置导致的奇怪 CORS 问题
- html - Safari 选择/下拉选项未与输入标签对齐
- python - Turtle exitonclick 使用时会报错
- java - Spring Boot 更改 URL 并破坏静态资产
- laravel - 在 Heroku 上使用带有 ClearDB 数据库的 Laravel Docker 容器 yields: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed
- glassfish - 我尝试将 glassfish 服务器与我的 Eclipse 集成,但出现错误“找不到基本名称的捆绑包”