簡體   English   中英

停止共享庫鏈接刪除未使用的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM