簡體   English   中英

從 C 可執行文件加載 C++ 動態庫時收到錯誤“未定義符號”

[英]Receiving the error “undefined symbol” when loading C++ dynamic library from C executable

我正在嘗試為一個我無法控制其代碼和編譯過程的流行程序編寫一個插件。 程序用 C 編寫。 但是,我在 C++ 中編寫了部分插件,因為我使用 QT5 庫來提供圖形功能。 C程序調用的函數寫在C中。

當 C 程序嘗試加載插件(共享庫)時,會產生以下錯誤:

dlopen('build/libfoo.so') failed: build/libfoo.so: undefined symbol: _ZTV13JoystickPanel

JoystickPanel是程序 C++ 部分中的 class。

我嘗試在 C 中重寫部分程序,但錯誤不受影響。 我知道我可以在 C 中重寫整個程序,但我寧願不必切換到另一個對 C 更友好的 GUI 框架。 我還在文本編輯器中打開了libfoo.so並搜索JoystickPanel ,但它似乎被損壞為_ZN13JoystickPanel

我缺少任何編譯器選項或解決方案嗎?

我不知道_ZN13JoystickPanel是什么意思,因為它顯然不是一個有效的損壞的 C++ 名稱。 它可能應該是_ZN13JoystickPanelE ,它將轉換為JoystickPanel 那肯定是符號名稱,但無論如何都沒有多大意義。 您一定截斷了一些東西:我嘗試了很多,但無法生成包含_ZN13JoystickPanel作為完整符號的 object 文件。 它只是一個前綴,應該附加一個“后半部分”——有嗎?

但是_ZTV13JoystickPanelJoystickPanel class 的 vtable。 它丟失是因為您沒有為JoystickPanel class 的所有虛擬方法提供實現。 很可能,您沒有正確調用 moc,或者忘記編譯和鏈接它的 output。

您至少需要為您的插件顯示一個完整的構建腳本( .pro文件或CMakeLists.txt )。 您還需要為您的項目提供 github 鏈接(我認為它是開源的)。

您想在編譯后的 output 中找到的符號至少是_ZTV13JoystickPanelD#Ev - 虛擬析構函數,其中 # 是數字, _ZTV13JoystickPanel - 虛擬方法表,

當使用優化和/或 LTCG 編譯時,這些符號可能不存在,但也會不存在對它們的引用。

您可能希望刪除 build 文件夾並重新構建您的項目,以確保這一點。 qmake不擅長為它生成的 makefile 生成依賴項,所以如果你使用它,我建議切換到cmake + ninja

顯然,我忘記將#include "moc_controller.cpp"行放在需要它的文件的底部。

對於在 CMake 上使用 Qt 時遇到此問題的其他人,請考慮確保添加了正確的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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