全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1248
推到 Plurk!
推到 Facebook!

bcc32 linking Error

尚未結案
asd98537
一般會員


發表:27
回覆:25
積分:10
註冊:2002-10-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-12 10:47:29 IP:163.25.xxx.xxx 未訂閱
將class的宣告放在.h,實作放在.cpp 如图所示:主程式和其它兩個class之间的關係,箭號表誰被#include 我在command mode,下 bcc32 ex.cpp CMMF.cpp CFunc.cpp 會發生如下的的link error Error: Unresolved external r2b(xx) referenced from CMMF.OBJ 我該如何修正它們之間include關係或是編譯連結時的參數,才能顺利通过linking? 發表人 - asd98537 於 2003/04/12 10:48:17
asd98537
一般會員


發表:27
回覆:25
積分:10
註冊:2002-10-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-12 11:26:11 IP:163.25.xxx.xxx 未訂閱
上圖中只要把CFunc.cpp裡面的實作移到和CFunc.h裡就沒問題 請問不能把宣告和實作分開嗎?
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-14 10:44:45 IP:61.218.xxx.xxx 未訂閱
引言: 上圖中只要把CFunc.cpp裡面的實作移到和CFunc.h裡就沒問題 請問不能把宣告和實作分開嗎?
其實你可以參考BCB的Form的unit1.cpp跟unit1.h的寫法.
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H<----在Unit1H你的CFunc.h中應該為CFuncH
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:        // IDE-managed Components
private:        // User declarations
public:                // User declarations
        __fastcall TForm1(TComponent* Owner);
        ___fastcall MyFunction(); //你寫的Function定義在此,至於是該放在Public/published還是Prvate就看你的function的功能而定
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
記住紅色字部分需要加進你的CFunc.h中 在你的CFunc.cpp中記得#include CFunc.h,然後就可以在CFunc.cpp做Function的實做 但記得要在你的CFunc.h將你寫好的functuin定義清楚喔!
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1; //Class的繼承宣告
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void _fastcall TForm1::MyFunction() //你想寫的Function
{
 ShowMessage("這是我寫的Function");
}
聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2003/04/14 10:53:13
asd98537
一般會員


發表:27
回覆:25
積分:10
註冊:2002-10-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-14 15:46:54 IP:163.25.xxx.xxx 未訂閱
//---------------------------------------------------------------------------#ifndef Unit1H#define Unit1H<----在Unit1H你的CFunc.h中應該為CFuncH//--------------------------------------------------------------------------- #ifndef Unit1H#define Unit1H 定義這個的目的在於防止重複include 我在每個.h宣告都有加入自已的#define xxxH 我編譯時打 bcc32 ex.cpp CMMF.cpp CFunc.cpp 它確找不到r2b(xx)在CFunc.cpp的實作 我目前的解決方法只有把func.cpp的實作全部移到CFunc.h裡
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-14 18:27:07 IP:61.218.xxx.xxx 未訂閱
引言: //---------------------------------------------------------------------------#ifndef Unit1H#define Unit1H<----在Unit1H你的CFunc.h中應該為CFuncH//--------------------------------------------------------------------------- #ifndef Unit1H#define Unit1H 定義這個的目的在於防止重複include 我在每個.h宣告都有加入自已的#define xxxH 我編譯時打 bcc32 ex.cpp CMMF.cpp CFunc.cpp 它確找不到r2b(xx)在CFunc.cpp的實作 我目前的解決方法只有把func.cpp的實作全部移到CFunc.h裡
asd98537您好: 因為圖我看不見,所以不知你的問題發生狀況,只能照您描述的給你回答.. 您是否有在 > <>網<>路志<>工聯盟---- href="http://www.vista.org.tw">http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
asd98537
一般會員


發表:27
回覆:25
積分:10
註冊:2002-10-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-14 21:44:16 IP:163.25.xxx.xxx 未訂閱
我找到原因了,我這個function 是friend void r2b(xx)在實作的部分,把它寫成inline void r2b(xx) ,拿掉inline就linking就過了 請問使用inline有何限制? 發表人 - asd98537 於 2003/04/14 21:48:23
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-15 10:18:40 IP:61.218.xxx.xxx 未訂閱
引言: 我找到原因了,我這個function 是friend void r2b(xx)在實作的部分,把它寫成inline void r2b(xx) ,拿掉inline就linking就過了 請問使用inline有何限制? 發表人 - asd98537 於 2003/04/14 21:48:23
inline的使用是為了配合巨集定義內簡易函數之使用,以inline保留字加在函數前,則程式在編譯時就可將該函數放入程式內,宛如巨集之取代作用以加快程式的執行 Syntax: inline < datatype > < class > _ < function > (< parameters >) { < statements >; Example: inline char* cat_func(void) { return char*; } 注意"inline"這個關鍵字.他告訴編譯器將函式直接展開到程式碼,而不是以 函式呼叫的方式.如果你所用的編譯器不支援"inline"或"_inline",嘗試利用 "static function"來定義這樣的函式 在 The C Programming Language, 2nd ed. 書中曾提到: INLINE func 的可見範圍 (scope) 乃比照 static func, 也就是: 僅限於該檔案本身 (及用 #include 來叫進含這個 INLINE 檔的其他程式檔案中) , 所以通常 INLINE func 的定義應出現在類似用 #define 來定義一個 "巨集函數" 的場合, 也就是: 應出現在『欲使用該 func 的檔案可看到該定義, 而非僅是該宣告』的場合。 所以若是 INLINE func 僅在該程式檔中用到而已 (即 static func 的意思) , 就放在一般函數該放的地方即可; 否則, 通常將該定義放在 .h 檔中, 以便所有要用到此 INLINE func 的檔案都能看到該定義 (想想 #define 的情形,就能明瞭這點) 。 從上面可知: 每次想呼叫該 INLINE func 的時候, 對 compiler 來說, 一定能夠『完整看到』該 INLINE func 的定義, 而不像一般 func 可能當時早已位於程式庫中, 而看不到該定義; 可能根本就還沒定義, 只有宣告而已。於是答案就很明顯了: 每次引用時, 對 compiler 來說, 形同將該 inline func 的定義部份 "塞" 進引用到的地方 (類似 macro 的作法) , 再整個編譯一次。所以 compiler 能把它看成是你自己每次都重寫一次該部 份的程式一樣, 自然不需額外負擔 func call。同時 compiler 也能對該 inline func 做比 #define 更多的語法、參數檢查。 但由於每次 compiler 都要重新處理 inline func 的部份, 易造成 compile-time delay, 所以 C Builder 有個 pre-compiled header 的功能, 可稍減此缺點。 注意一點 使用Inline function不可做遞回使用,也就是不可自己呼叫自己,原因是巨集不能做遞回動作. 以上如有錯誤請指正! } 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2003/04/15 10:22:32
asd98537
一般會員


發表:27
回覆:25
積分:10
註冊:2002-10-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-15 17:26:47 IP:163.25.xxx.xxx 未訂閱
謝謝你
系統時間:2024-05-08 1:20:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!