【发布时间】:2020-03-18 03:50:32
【问题描述】:
我发现了很多关于消除死代码的相反问题的问题,但我找不到答案:
给定一个类层次结构,如:
BaseView
+- Base2DView
+- Concrete2DView
+- Specialised2DView
我将所有文件链接到view_classes.a,然后添加实例化Concrete2DView 的代码并创建view_renderer.so。接下来,我创建另一个库 specialised_view_renderer.so,它实例化 Specialised2DView 并将 view_renderer.so 列为依赖项。
但是,生成view_renderer.so 的过程已将Specialised2DView.cpp.o 文件作为未使用的代码消除,因为当我使用nm view_renderer.so 时没有任何结果。
我知道链接 view_classes.a 或将 Specialised2DView.cpp 移动到 specialised_view_renderer.so 项目可以解决此问题,但这是我可能不应该过多摆弄的遗留第三方代码。
那么,在构建view_renderer.so 时,是否有一种简单的方法可以将Specialised2DView.cpp.o 或其中的类标记为不会被消除?如果有标准cmaketarget_link_libraries() 线路的选项,则加分。
【问题讨论】:
-
CMP0063 似乎是相关的,因为它提到“但是,某些源可能被编译为静态库或对象库的一部分,然后稍后链接到共享库中。”这是你的用例。您可能还需要将静态库上的
CXX_VISIBILITY_PRESET属性(或全局CMAKE_CXX_VISIBILITY_PRESET)设置为default
标签: c++ linux cmake shared-libraries