[英]Stop shared library linking dropping unused classes
我發現了很多關於消除死代碼的相反問題的問題,但我找不到答案:
給定一個 class 層次結構,如:
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
或 class 標記為不被消除? 如果有標准cmake
target_link_libraries()
行的選項,則加分。
那么,是否有一種簡單的方法可以在構建 view_renderer.so 時將 Specialised2DView.cpp.o 或 class 標記為不被消除?
是的:
g++ -shared -o view_renderer.so ... \
-Wl,--whole-archive view_classes.a -Wl,--no-whole-archive
要了解為什么會發生這種情況,以及解決方案為何有效,您需要了解鏈接器使用的規則來 select 哪些對象要包含在鏈接中。 一個很好的描述是here 。
我得出的解決方案如下。 在我有之前:
BaseView
+-- virtual void foo() = 0;
+- Base2DView
+-- virtual void foo() {...}
+- Concrete2DView
+-- virtual void foo() {...}
+- Specialised2DView
+-- void bar() {foo();}
如果我將葉子調用更改為:
+-- void bar() {Concrete2DView::foo();}
代碼鏈接並運行無問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.