2016-11-17 35 views
0

我遇到了一個問題,將我的共享庫鏈接到OpenDDS(v3.9)靜態庫,因爲我無法找到此方法簽名所在的位置。OpenDDS中的哪個庫包含「OpenDDS :: DCPS :: operator <<」?

這是錯誤。

[exec] libs/mylib/ABTypeSupportImpl.cpp:74: error: undefined reference to 'OpenDDS::DCPS::operator<<(OpenDDS::DCPS::Serializer&, short)' 
[exec] collect2: error: ld returned 1 exit status 
[exec] make: *** [/tmp/mybuild/lib_ab/obj/local/armeabi-v7a/lib_ab.so] Error 1 

通過編譯IDL自動生成ABTypeSupportImpl.cpp。接下來會出現更多相同的錯誤。由於名稱空間(OpenDDS :: DCPS),我認爲這可以在庫libOpenDDS_Dcps.a中找到,但是在此lib上使用nm,然後grep'ing爲「運算符」或「<」,不會產生任何結果。難道這個名字對於重載操作符來說有點陌生嗎?我在$ DDS_ROOT/lib中的每個庫文件上運行這個函數,但什麼也沒找到。

如果我重新編譯IDL並刪除數據類型如短或長的結構的成員字段,那麼沒有錯誤,並且一切都很好。

任何人都知道此方法簽名可能位於哪個庫?

回答

1

這些運算符在'dds/DCPS/Serializer.h'中聲明,但在Serializer.inl中內聯實現。可能你編譯的OpenDDS內聯啓用(默認),但是當你編譯你的應用程序時,內聯禁用編譯。

+0

告訴我的程序是否內聯,我認爲是一種內部優化,編譯器可以選擇或不選擇這樣做。至少這是我的理解。我沒有特別禁用我編譯中的任何東西。我一直在嘗試各種標誌。 – Ender

+0

此外,我試過GCC優化選項與01和更高,這似乎做了很多內聯函數,但仍然沒有去。 – Ender

+0

在OpenDDS(和ACE)中有一個用於啓用或禁用內聯方法的定義,它是代碼級使用內聯或不內聯的功能。嘗試將__ACE_INLINE__或ACE_NO_INLINE添加到編譯器定義的編譯代碼時,請檢查OpenDDS編譯在編譯OpenDDS時使用哪一個 –