PIXNET Logo登入

Welkin小窩

跳到主文

柴米油鹽的平淡生活

部落格全站分類:不設分類

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 8月 21 週四 201415:18
  • 'XX' does not name a type 和 field 'XX' has incomplete type - 兩個 C++ 編譯錯誤及解決辦法


'XX' does not name a type 和 field 'XX' has incomplete type - 兩個 C++ 編譯錯誤及解決辦法
編譯錯誤一:
XX does not name a type,中文意思為“XX沒有命名一個類型“
(繼續閱讀...)
文章標籤

BB 發表在 痞客邦 留言(0) 人氣(3,500)

  • 個人分類:Trace&Debug
▲top
  • 5月 23 週五 201413:46
  • 自訂debug message

在 Linux driver 開發的初期我們常會為了程式的開發方便及除錯,在裡面加了很多的debugmessage,
等到開發到了一定的階段才會拿掉。
(繼續閱讀...)
文章標籤

BB 發表在 痞客邦 留言(0) 人氣(849)

  • 個人分類:Trace&Debug
▲top
  • 7月 03 週三 201315:46
  • addr2line

使用 addr2line 追蹤自有動態庫(so文件)的bug,補充:
解決出現??:0 ,沒法展示源代碼行數的問題
在Android.mk文件中:
Java代碼  

  • LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS -Wl,-Map=test.map -g  

  • (繼續閱讀...)
    文章標籤

    BB 發表在 痞客邦 留言(0) 人氣(802)

    • 個人分類:Trace&Debug
    ▲top
    • 1月 17 週四 201317:06
    • control reaches end of non-void function

    control reaches end of non-void function
     
    => 函數應該要回傳但卻沒有...
    (繼續閱讀...)
    文章標籤

    BB 發表在 痞客邦 留言(0) 人氣(2,075)

    • 個人分類:Trace&Debug
    ▲top
    • 5月 23 週三 201211:55
    • the frame size of XXX bytes is larger than 1024 bytes

    最近編譯時遇到的問題
    找了好久
    終於知道了><...
    --------------------------------
    簡單舉例
    (繼續閱讀...)
    文章標籤

    BB 發表在 痞客邦 留言(0) 人氣(1,534)

    • 個人分類:Trace&Debug
    ▲top
    • 9月 02 週四 201018:42
    • ISO C90 forbids mixed declarations and code


    ISO C90 forbids mixed declarations and code
    通常出現這種警告的原因很簡單
    就是你的變數的宣告,太後面了
    也就是說你必須確定變數的宣告是在最前面,變數之前不可以有執行動作敘述
    (繼續閱讀...)
    文章標籤

    BB 發表在 痞客邦 留言(1) 人氣(11,535)

    • 個人分類:Trace&Debug
    ▲top
    • 8月 30 週一 201016:15
    • assignment discards qualifiers from pointer target type


    這個 warning 錯誤說明, 回傳值是一個 const 的類型,而你聲明使用的那個變數並不是 const, 舉例如下:
    u_char *p = pcap_next(**, **);
    因為 pcap_next 回傳的是一個 const u_char* ,而這裡適用的卻是 u_char* ,因此編譯器會通知你,這裡有潛在的錯誤。
    (繼續閱讀...)
    文章標籤

    BB 發表在 痞客邦 留言(1) 人氣(3,708)

    • 個人分類:Trace&Debug
    ▲top
    • 8月 30 週一 201014:12
    • implicit declaration of function


    implicit declaration of function <= 欠缺標頭檔
    是因為在C 編譯器裡,如果你如果直接使用函式而無include其標頭檔的話,
    在編譯(compile)時C 編譯器會暫時相信你而並不會顯示錯誤,
    只會給你一個警告:implicit declaration of function <函式名>。
    但是在link時,C 編譯器會在你的程式及基本函式庫裡找你所用的函式。
    如果找不到,C 編譯器就會給你一個linker錯誤:undefined reference to <函式名>。
    若找得到就無事。
    (繼續閱讀...)
    文章標籤

    BB 發表在 痞客邦 留言(1) 人氣(52,225)

    • 個人分類:Trace&Debug
    ▲top
    • 5月 07 週五 201011:28
    • Eerror : storage class specified for parameter


    今天編譯時,出現error: storage class specified for parameter問題
    在檢查程式碼目前位置時,並沒有發現錯誤,僅僅定義了一個結構體
    繼續向上追溯,發現是新增的標頭文件中,最後一個函數的聲明缺少一個分號引起";"
    這個錯誤雖然很小,但檢查起來不是很容易。
    主要原因我覺得還是gcc做語法檢查的時候進行了過多的錯誤處理,忽略了識別不了的token。
    這樣錯誤被累計導致産生這個報警信息,後續需要多多注意
    (繼續閱讀...)
    文章標籤

    BB 發表在 痞客邦 留言(1) 人氣(3,153)

    • 個人分類:Trace&Debug
    ▲top
    • 3月 17 週三 201018:41
    • multiple definition of XXX first defined here 的錯誤


    multiple definition of XXX first defined here 的錯誤
    將程式分成includeall.h、functions.h、main.cpp、functions.cpp with DevCpp Compiler
    但compiler時會出現以下錯誤訊息:
    multiple definition of 'vNumCount'
    first defined here
    multiple definition of 'AllCount'
    first defined here
    以下為檔案內容:
    //============================================================================/
    /***includeall.h***/
    #include <cstdlib>
    #include <iostream>
    #include <vector>
    /***functions.h***/
    #ifndef function S_H
    #define function S_H
    #include "includeall.h"
    using namespace std;
    vector<int> vNumCount;
    int AllCount;
    int showCount();
    #endif
    /***functions.cpp***/
    #include "includeall.h"
    #include "functions.h"
    using namespace std;
    int showCount()
    {
        vNumCount.assign(10,42);//指派10個元素為42給vNumCount
        vector<int>::iterator Iter = vNumCount.begin();
        AllCount = 0;
        for(Iter = vNumCount.begin(); Iter != vNumCount.end(); ++Iter) {
         cout << *Iter << '\0';
         ++AllCount;
        }
        return 0;
    }
    /***main.cpp***/
    #include "includeall.h"
    #include "functions.h"
    using namespace std;
    int main(int argc, char *argv[])
    {
        showCount();
        cout << AllCount;
        system("PAUSE");
        return EXIT_SUCCESS;
    } 
    //============================================================================/
    #ifndef/#define 這個組合像你在頭檔裡這樣子用叫做 header guard.
    除了知道 header guard 的原理外, 你還必須知道一個叫 "compilation unit" 的概念.
    一個 "compilation unit" 通常就是一個 .cpp 檔.
    這個 .cpp 檔可能有數十個或數百個 #include, 每一個 #include 的程式碼裡又可以有許多個 #include.
    這一個 .cpp 加上所有的, 直接及間接的 #include, 就是一個 "compilation unit".
    一個很重要的概念是:
    "每一個 compilation unit 是個獨立的個體, 所有的 #define 只在一個 compilation unit 裡有作用."
    在編譯器建構你的專案的時候, main.cpp 跟 function s.cpp 是分開編譯的,
    所以這裡就有兩個 compilation units.
    每一個 compilation unit 會有一個同名的 object 檔, extension 通常是 .obj 或 .o.
    你在 function s.h 裡定義了一個 vNumCount 物件. 因為 main.cpp 及 function s.cpp 都 #include "functions.h",
    所以在 main.obj 及 function s.obj 都會有這個物件的定義.
    個別編譯的時候當然不會有問題, 因為 main.cpp 及 function s.cpp 是互不相干的兩個個別的 compilation units.
    main.cpp 裡的 #define 不會影響到編譯器在編譯 function s.cpp 時的行為, 反之亦然.
    問題的發生是在 link 的時候. Linker 必須把所有的 object 檔整合成一個執行檔, 過程中的工作包括把函式呼叫與函式定義連接起來, 把物件的使用連結到它定義的位址, ...等.
    當 Linker 整合 main.obj 及 function s.obj 的時候, 它發現到這兩個 object 檔都有 vNumCount 這個物件的定義. 捨棄其中一個, 或把它們結合成一個都不是 linker 的工作, 既然 linker 無法解決這個問題, 當然就把球丟回給你了.
    解決方法:
      - 物件只在 .cpp 檔裡定義, 而且其他的 .cpp 檔不直接或間接 #include 有物件定義的 .cpp 檔.
      - 儘量避免使用全域物件.
    以你的問題來說, 把
      vector<int> vNumCount;
    從 function s.h 移到 function s.cpp 就可以輕易的解決這個 linker 的問題了.
    即使物件在多個 .cpp 檔裡都有用到, 也只在其中一個 .cpp 檔裡定義. 在 .h 檔則加用 extern 關鍵字來『宣告』物件. 所有用到這個物件的 .cpp 檔都 #include 這個 .h 檔.
    比方說: 如果 main.cpp 及 function s.cpp 都有用到 vNumCount 這個物件, 那:
    〔functions.h〕
      ...
      extern vector<int> vNumCount;
      ...
    〔functions.cpp〕
      #include "functions.h"
      vector<int> vNumCount;
      ...
    〔main.cpp〕
      #include "functions.h"
      ...
    【註】
    上面的例子, vNumCount 是在 function s.cpp 裡定義的, 也可以把它移到 main.cpp 裡. 但只有一個『定義』.
    在 function s.h 裡面的 extern vector<int> vNumCount 不是『定義』, 它是個『宣告』.
    『宣告』沒有實體, 它告訴編譯器: 「有這麼一個東西, 但在其它地方, 留待 linker 來解決」.
    但最好的方法還是儘量少用或不用全域物件.
     
    (繼續閱讀...)
    文章標籤

    BB 發表在 痞客邦 留言(1) 人氣(15,579)

    • 個人分類:Trace&Debug
    ▲top
    12»

    文章分類

    toggle 生活集錦 (3)
    • 影音歌詞 (17)
    • 生活其它 (4)
    • 媽媽寶寶 (25)
    toggle SYSTEM (8)
    • Linux-Pre (9)
    • Yocto (1)
    • Linux System (20)
    • Embedded (19)
    • Linux Kernel (24)
    • Ubuntu Manage (8)
    • Linux Debug & Trace (2)
    • Android (21)
    toggle Programing (3)
    • Trace&Debug (11)
    • GNU C (12)
    • Programing C & C++ (22)
    toggle MultiMedia (3)
    • Video (20)
    • FFmpeg (14)
    • mplayer (13)
    toggle Computer (3)
    • 系統安裝 (5)
    • 常見問題 (10)
    • 電腦基礎 (3)
    • 未分類文章 (1)

    文章搜尋

    個人資訊

    BB
    暱稱:
    BB
    分類:
    不設分類
    好友:
    累積中
    地區:

    參觀人氣

    • 本日人氣:
    • 累積人氣:

    Scotch甜蜜貼紙