我正在撰寫一些代碼,這些代碼從一個更大的專案中呼叫一些類。我們將大型專案稱為SampleProject。我有名為 libSampleProject.a 的 SampleProject 靜態庫。我無法顯示實際代碼,但我將提供一些示例:
假設 SampleProject 在名為 SamplePointers.cpp 的源檔案中有一個名為 SamplePointers 的類。
在 SamplePointers.cpp 中,有指向 SampleProject 中其他類的指標。所以舉個例子,有一個名為ReadXml的類,ReadXml是SamplePointers類的一個成員,作為一個指標。
class SamplePointers {
public:
ReadXml * readXmlObject;
<MANY OTHER POINTERS TO CLASSES>
}
僅供參考:指標在 SamplePointers 類的建構式中初始化。
在我的 CPP 檔案 main.cpp 中,我呼叫的 Class 如下所示:
#include <iostream>
#include <SampleClass.hpp>
int main() {
SamplePointers * sampleObject = new SamplePointers;
sampleObject->read("sampleFile.xml");
std::cout << sampleObject->readXmlObject->xmlDataField << "\n";
}
SamplePointers 還具有讀取 XML 欄位的讀取函式。通過訪問成員變數,這些欄位將在 ReadXml 類中可用。運行此可執行檔案,將列印xmlDataField的值。但是,在GDB上除錯時,我在說read行上設定了一個斷點,然后在此路徑中鍵入sampleObject->readXmlObject->xmlDataField,按回車鍵,然后gdb說沒有名為readXmlObject的成員。
這很奇怪,因為我可以使用 std::cout 將其列印出來,但是 gdb 無法物理訪問物件成員變數。
為什么 gdb 無法訪問成員的任何想法?
GDB 輸出示例:
(gdb) file out
(gdb) b 7
(gdb) run
(gdb) <breaks at line 7>
(gdb) p sampleObject->readXmlObject->xmlDataField
There is no member named readXmlObject
另外,這里是 Makefile 的樣子:
INCLUDES = -I/path/to/SamplePointersHeader -I/path/to/ReadXmlHeader -I/many/more/headers
main:
g main.cpp $(INCLUDES) -L/path/to/SampleProjectLib -lSampleProject -o out
debug:
g -g main.cpp $(INCLUDES) -L/path/to/SampleProjectLib -lSampleProject -o out
uj5u.com熱心網友回復:
感謝@GM 的建議。我相信問題可能是當我制作庫時,我在沒有除錯標志的情況下編譯它,即-g標志。我重新編譯了庫,從目標檔案中生成了庫,甚至將優化級別從 -O3 更改為 -O0,這將有助于除錯。
然后我main.cpp用新創建的庫重新編譯我的檔案,通過 GDB 傳遞它,它能夠找到類成員。
感謝所有的投入!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/347384.html
