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

C函數共用給BCB的問題...

答題得分者是:miyu
cdklokBCB
一般會員


發表:15
回覆:27
積分:8
註冊:2003-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-06 13:26:15 IP:219.68.xxx.xxx 未訂閱
我有一C程式想share給BCB //c code------------------------- ======================================= sim.h #include  #include unsigned char *filename; typedef struct pict_image { unsigned char *lum; /* Luminance plane */ unsigned char *Cr; /* Cr plane */ unsigned char *Cb; /* Cb plane */ } PictImage; PictImage *InitImage(int); ======================================== io.c PictImage *InitImage(int size) { PictImage *new1; new1 = (PictImage *)malloc(sizeof(PictImage)); new1->lum = (unsigned char *)malloc(sizeof(char)*size); new1->Cr = (unsigned char *)malloc(sizeof(char)*size/4); new1->Cb = (unsigned char *)malloc(sizeof(char)*size/4); return new1; } ======================================== //BCB---------------------------------- ======================================== Unit1.cpp #include "sim.h" ... void __fastcall TFormMain::AVIClick(TObject *Sender) { PictImage *Pict; Pict = InitImage(w*h); } ======================================== Unit2.cpp #include "sim.h" ... void __fastcall TFormMain::AV2Click(TObject *Sender) { PictImage *Pict; Pict = InitImage(w*h); } ======================================== 為何都會出現[Linker Warning] Public symbol defined in both module D:\DVP\UNIT1.OBJ and D:\DVP\UNIT2.OBJ 我想要的做法為... sim.h->宣告所有參數跟函數 io.c->函數的方法 unit1.cpp->#include "sim.h"來使用io.c的函數 unit2.cpp->#include "sim.h"來使用io.c的函數 請各位大大幫忙啊...thanks....
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-06 13:44:28 IP:61.219.xxx.xxx 未訂閱
引言: 我有一C程式想share給BCB 為何都會出現[Linker Warning] Public symbol defined in both module D:\DVP\UNIT1.OBJ and D:\DVP\UNIT2.OBJ
//c code------------------------- =======================================
sim.h
unsigned char *filename;
======================================== //BCB---------------------------------- ======================================== Unit1.cpp
#include "sim.h"
...
======================================== Unit2.cpp
#include "sim.h"
...
======================================== 標上紅色的地方就是關鍵 詳細理由請參考這篇post, 往下捲到我吐嘈的地方去 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=29349 --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-06 13:54:42 IP:61.218.xxx.xxx 未訂閱
    =======================================
sim.h    #ifndef __sim__
#define __sim__    #include 
#include 
unsigned char *filename;
typedef struct pict_image {
  unsigned char *lum;        /* Luminance plane        */
  unsigned char *Cr;        /* Cr plane        */
  unsigned char *Cb;        /* Cb plane        */
} PictImage;
PictImage *InitImage(int);    #endif
========================================      
發表人 - cmf 於 2003/09/06 13:56:48
------
︿︿
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-06 15:14:08 IP:61.219.xxx.xxx 未訂閱
引言:
    =======================================
sim.h    #ifndef __sim__
#define __sim__    #include 
#include 
unsigned char *filename;
typedef struct pict_image {
  unsigned char *lum;        /* Luminance plane        */
  unsigned char *Cr;        /* Cr plane        */
  unsigned char *Cb;        /* Cb plane        */
} PictImage;
PictImage *InitImage(int);    #endif
========================================      
發表人 - cmf 於 2003/09/06 13:56:48
他的問題是出在, 同一個 scope (global scope) 中, 同時出現兩個同名的變數. 你這樣作只是避免同一個 header file被重覆 include 到 (這是另一個skill), 但是無法避免linker 的警告. 因為只要include到 sim.h 的程式都會出現一個 unsigned char *filename; 的宣告 --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-06 15:23:06 IP:61.218.xxx.xxx 未訂閱
    =======================================
sim.h    #ifndef __sim__
#define __sim__    #include 
#include     typedef struct pict_image {
  unsigned char *lum;        /* Luminance plane        */
  unsigned char *Cr;        /* Cr plane        */
  unsigned char *Cb;        /* Cb plane        */
} PictImage;
PictImage *InitImage(int);     extern unsigned char *filename;     #endif
========================================    ========================================
io.c    #include "sim.h"      unsigned char *filename;     PictImage *InitImage(int size)
{
PictImage *new1;
new1 = (PictImage *)malloc(sizeof(PictImage));
new1->lum = (unsigned char *)malloc(sizeof(char)*size);
new1->Cr = (unsigned char *)malloc(sizeof(char)*size/4);
new1->Cb = (unsigned char *)malloc(sizeof(char)*size/4);
return new1;
}
========================================    
發表人 - cmf 於 2003/09/06 15:48:52
------
︿︿
cdklokBCB
一般會員


發表:15
回覆:27
積分:8
註冊:2003-02-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-07 15:03:34 IP:219.68.xxx.xxx 未訂閱
引言:
    =======================================
sim.h    #ifndef __sim__
#define __sim__    #include 
#include     typedef struct pict_image {
  unsigned char *lum;        /* Luminance plane        */
  unsigned char *Cr;        /* Cr plane        */
  unsigned char *Cb;        /* Cb plane        */
} PictImage;
PictImage *InitImage(int);     extern unsigned char *filename;     #endif
========================================    ========================================
io.c    #include "sim.h"      unsigned char *filename;     PictImage *InitImage(int size)
{
PictImage *new1;
new1 = (PictImage *)malloc(sizeof(PictImage));
new1->lum = (unsigned char *)malloc(sizeof(char)*size);
new1->Cr = (unsigned char *)malloc(sizeof(char)*size/4);
new1->Cb = (unsigned char *)malloc(sizeof(char)*size/4);
return new1;
}
========================================    
發表人 - cmf 於 2003/09/06 15:48:52
//--- 請問cmf大大... 加上#ifndef __sim__ #define __sim__ ... #endif 的真正意義是什麼呢?我去掉後好像也可以過... 另外..我知道使用extern的方法..但只有這個方法ㄇ?! 因為如此...我每個*.cpp要使用到filename..則必須都加上宣告 unsigned char *filename... 如此雖然都是共用一個...但好像就有點麻煩... 不像C如此方便...只要include到就可以用了...
有問題了... ----------------------------------- sim.h extern int h; unsigned char *filename; ----------------------------------- unit1.cpp #include "sim.h" int h; void __fastcall TFormMain::AVIClick(TObject *Sender) {h=320;} ----------------------------------- ----------------------------------- unit2.cpp #include "sim.h" int h; void __fastcall TFormMain::AV2Click(TObject *Sender) {ShowMessage(h);} ----------------------------------- 為何unit2.cpp不會顯示出320 ????? 我就算把#include "sim.h"放在unit1/2.h也沒用耶... 發表人 - cdklokBCB 於 2003/09/07 16:29:22
新手上路1234
一般會員


發表:3
回覆:24
積分:15
註冊:2002-12-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-07 16:41:44 IP:61.70.xxx.xxx 未訂閱
     sim.h
extern int h;
unsigned char *filename;
-----------------------------------
unit1.cpp
#include "sim.h"
int h;
void __fastcall TFormMain::AVIClick(TObject *Sender)
{h=320;}
-----------------------------------
-----------------------------------
unit2.cpp
#include "sim.h"
 int h;  // 把這一行去掉, 因為unit1.cpp 已有一個 int h
 
void __fastcall TFormMain::AV2Click(TObject *Sender)
{ShowMessage(h);}
-----------------------------------    加上#ifndef __sim__
#define __sim__ ... #endif
的真正意義是什麼呢?
 避免重複定義
         
發表人 - 新手上路1234 於 2003/09/07 16:44:03
cdklokBCB
一般會員


發表:15
回覆:27
積分:8
註冊:2003-02-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-07 17:05:37 IP:219.68.xxx.xxx 未訂閱
引言:
     sim.h
extern int h;
unsigned char *filename;
-----------------------------------
unit1.cpp
#include "sim.h"
int h;
void __fastcall TFormMain::AVIClick(TObject *Sender)
{h=320;}
-----------------------------------
-----------------------------------
unit2.cpp
#include "sim.h"
 int h;  // 把這一行去掉, 因為unit1.cpp 已有一個 int h
 
void __fastcall TFormMain::AV2Click(TObject *Sender)
{ShowMessage(h);}
-----------------------------------    加上#ifndef __sim__
#define __sim__ ... #endif
的真正意義是什麼呢?
 避免重複定義
         
發表人 - 新手上路1234 於 2003/09/07 16:44:03
/---- 謝謝...參數部分是成功了.. 但是如果 -------------------------------- sim.h extern char *seqfilename; extern unsigned char *image; unsigned char *ReadImage(char *); extern int h; extern int w; -------------------------------- io.c #include "sim.h" unsigned char *ReadImage(char *filename) { FILE *im_file = NULL; int im_size = w*h*3/2; unsigned char *raw; raw = (unsigned char *)malloc(sizeof(char)*im_size); im_file = fopen(filename,"rb"); fread(raw, sizeof(char), im_size, im_file); /* Read image */ fclose(im_file); return raw; } -------------------------------- unit1.cpp #include "sim.h" char *seqfilename; unsigned char *image; PictImage *curr_image; int h; int w; void __fastcall TFormMain::AVIClick(TObject *Sender) { h=320; w=240; //seqfilename已有空間加檔名 image = ReadImage(seqfilename); } -------------------------------- 會出現[Linker Error] Unresolved external 'ReadImage(char *, int, int)' referenced from D:\UNIT1.OBJ 並且io.c裡面的h,w可以抓到320,240ㄇ... 謝謝...
新手上路1234
一般會員


發表:3
回覆:24
積分:15
註冊:2002-12-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-07 17:26:24 IP:61.70.xxx.xxx 未訂閱
ReadImage(char *); 與 ReadImage(char *, int, int); 名稱相同 改個名吧
cdklokBCB
一般會員


發表:15
回覆:27
積分:8
註冊:2003-02-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-09-07 18:06:31 IP:219.68.xxx.xxx 未訂閱
引言: ReadImage(char *); 與 ReadImage(char *, int, int); 名稱相同 改個名吧
抱歉 打錯了...訊息是這樣... [Linker Error] Unresolved external 'ReadImage(char *)' referenced from D:\UNIT1.OBJ 一樣也是error...
新手上路1234
一般會員


發表:3
回覆:24
積分:15
註冊:2002-12-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-09-07 20:36:52 IP:61.70.xxx.xxx 未訂閱
請把 io.c 檔加入你的專案檔
cdklokBCB
一般會員


發表:15
回覆:27
積分:8
註冊:2003-02-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-09-07 21:37:06 IP:219.68.xxx.xxx 未訂閱
引言: 請把 io.c 檔加入你的專案檔
我已加入了..可是還是沒辦法... -------------------------------- sim.h extern char *seqfilename; extern unsigned char *image; unsigned char *ReadImage(char *); extern int h; extern int w; -------------------------------- io.c #include "sim.h" unsigned char *ReadImage(char *filename) { FILE *im_file = NULL; int im_size = w*h*3/2; unsigned char *raw; raw = (unsigned char *)malloc(sizeof(char)*im_size); im_file = fopen(filename,"rb"); fread(raw, sizeof(char), im_size, im_file); /* Read image */ fclose(im_file); return raw; } -------------------------------- unit1.cpp #include "sim.h" char *seqfilename; unsigned char *image; PictImage *curr_image; int h; int w; void __fastcall TFormMain::AVIClick(TObject *Sender) { h=320; w=240; //seqfilename已有空間加檔名 image = ReadImage(seqfilename); } -------------------------------- 還是會出現[Linker Error] Unresolved external 'ReadImage(char *, int,.. 我目前只好把所有function的方法的寫在sim.h裡面..才可以... 或者unit1.cpp上面加#include "io.c" 但我有許多分開的function寫在各自xx.c裡面.. 請問還是沒法解決ㄇ...?! 感謝您的幫助...
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-09-07 22:03:49 IP:61.219.xxx.xxx 未訂閱
這是 C/C++ 函式簽名不同的關係.    在 C 中, 你寫了一個 叫 TestFunc() 的 function, 它在 object / library 中被 export 出來的名稱叫作 _TestFunc();    但是, 在 C++ 中, 並不會被 export 為 _TestFunc(). 會叫什麼你要問老天爺. 例如, Borland C++ Builder 6 叫作@TestFunc$qi().    目前, C++ 的函式簽名的命明原則並沒有被規定在 specification 中, 各家 compiler 是八仙過海, 各顯神通.    以你的例子來說, 你在 Unit1.cpp 中 #include "sim.h", preprocessor 在 cpp file 中展開了 header file, compiler 看到的是在 "C++" 領域中有一個 unsigned char *ReadImage(char *); 的定義. 因此, Compiler 輸出的 Object file 告訴 Linker, 在 linking time, 你要幫我 binding 一個叫作 @ReadImage$xxx 的函式.    但是, 因為你的 io.c 是 "C" 檔, compiler export 的名稱是 _ReadImage(), 所以 Linker 當然會叫說找不到 ReadImage() 啦.    我實在蠻懶得改你的 code 的架構.. 如果講求 short-term solution, 那就這樣改吧:    
extern char *seqfilename;
extern unsigned char *image;
#ifdef __cplusplus
extern "C"
#endif
unsigned char *ReadImage(char *);
extern int h;
extern int w;
還是老話一句, Ansi/ISO C Standard specification 一本也沒多少錢... --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子 發表人 - miyu 於 2003/09/07 22:24:31
cdklokBCB
一般會員


發表:15
回覆:27
積分:8
註冊:2003-02-19

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-09-08 00:22:50 IP:219.68.xxx.xxx 未訂閱
引言: 這是 C/C 函式簽名不同的關係. 在 C 中, 你寫了一個 叫 TestFunc() 的 function, 它在 object / library 中被 export 出來的名稱叫作 _TestFunc(); 但是, 在 C 中, 並不會被 export 為 _TestFunc(). 會叫什麼你要問老天爺. 例如, Borland C Builder 6 叫作@TestFunc$qi(). 目前, C 的函式簽名的命明原則並沒有被規定在 specification 中, 各家 compiler 是八仙過海, 各顯神通. 以你的例子來說, 你在 Unit1.cpp 中 #include "sim.h", preprocessor 在 cpp file 中展開了 header file, compiler 看到的是在 "C " 領域中有一個 unsigned char *ReadImage(char *); 的定義. 因此, Compiler 輸出的 Object file 告訴 Linker, 在 linking time, 你要幫我 binding 一個叫作 @ReadImage$xxx 的函式. 但是, 因為你的 io.c 是 "C" 檔, compiler export 的名稱是 _ReadImage(), 所以 Linker 當然會叫說找不到 ReadImage() 啦. 我實在蠻懶得改你的 code 的架構.. 如果講求 short-term solution, 那就這樣改吧:
extern char *seqfilename;
extern unsigned char *image;
#ifdef __cplusplus
extern "C"
#endif
unsigned char *ReadImage(char *);
extern int h;
extern int w;
還是老話一句, Ansi/ISO C Standard specification 一本也沒多少錢... --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子 發表人 - miyu 於 2003/09/07 22:24:31
我有個疑問..當我#include "io.c"時.. 就可使用io.c裡面的function了... 但我沒加上 #ifdef __cplusplus extern "C" #endif 總之還是謝謝各位大大的幫忙... 我已經把io.c改成io.cpp了... *_* forget me, is beginner...
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-09-08 01:42:55 IP:61.219.xxx.xxx 未訂閱
引言: 我有個疑問..當我#include "io.c"時.. 就可使用io.c裡面的function了... 但我沒加上 #ifdef __cplusplus extern "C" #endif 總之還是謝謝各位大大的幫忙... 我已經把io.c改成io.cpp了...
這個我之前引的 post 有寫過吧. 所有 # 開頭的東西都是給 preprocessor 看的. preprocessor 原則上會替你把這些 # 開頭的東西展開並插入, #pragma 比較神秘一點, 可能是轉成某些編譯指令給 compiler. (這也是看 compiler 怎麼實作) 所以你寫 #include "io.c" preprocessor 會先把 #include "io.c" 這一行, 換成 io.c 這個檔的內容. 所以, compiler 看到的是一個 'function 實作' 在那邊, 而不是看到一個 '#include io.c' 於是乎, 既然這是個 c 程式, compiler 理所當然會在 unit1.cpp 裡輸出 ReadImage() 這個 function, 而 Linker 自然也找得到它. 簡單說, 如果你有一個 C 語言的 function 要讓 C 呼叫, 或是有 global var 要 export, 請在 header file 裡加上類似這樣的東西:
#ifdef __cplusplus
extern "C"
{
#endif    // your define here    #ifdef __cplusplus
}
#endif    
如果, 你的 header file 就可以同時給 c/c 去使用. --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子
系統時間:2024-04-27 9:38:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!