【发布时间】:2019-09-02 01:45:40
【问题描述】:
将包含不同版本的 boost 的静态 cpp 库和动态 cpp 库链接是否会违反 ODR?
我正在开发一个 iphone 应用程序。对于最终的可执行文件,我需要链接一个静态库,比如 libstatic1.a 和一个动态框架,比如 libdyanamic1。
libstatic1.a 包含某些版本的 boost,比如 boost 1.x,而 libdynamic1 包含另一个版本的 boost,比如 boost 1.y。现在链接这两者的最终可执行文件会违反 ODR 规则吗?
libdynamic1 中的符号可见性:
我使用 nm -g -C libdynamic1 检查了 libdynamic1 中存在的符号,并观察到列表中存在 boost 线程池和 boost 文件系统的符号。
如果我违反了 ODR,我有哪些选择来处理这种情况? (到目前为止,我已经在多台设备上测试了可执行文件,没有遇到任何问题。)
【问题讨论】:
-
通常会有一个标志让链接器忽略这种情况
-
你碰巧知道国旗吗?它将如何运作?它会解决对其中一个库的所有 boost 调用吗?
-
这一切都取决于一个问题:
libdynamic1是导出一些增强的东西还是只是在内部使用它而不导出任何符号? -
与
nm -g核对。它确实导出了一些与线程、日期时间和异常相关的 boost 内容。 -
好吧,那么你很可能会遇到一些问题……
标签: c++ iphone clang one-definition-rule