C函數共用給BCB的問題... |
答題得分者是:miyu
|
cdklokBCB
一般會員 發表:15 回覆:27 積分:8 註冊:2003-02-19 發送簡訊給我 |
我有一C程式想share給BCB
//c code-------------------------
=======================================
sim.h
#include
|
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 我有一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 發送簡訊給我 |
======================================= sim.h #ifndef __sim__ #define __sim__ #include發表人 - cmf 於 2003/09/06 13:56:48
------
︿︿ |
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言:他的問題是出在, 同一個 scope (global scope) 中, 同時出現兩個同名的變數. 你這樣作只是避免同一個 header file被重覆 include 到 (這是另一個skill), 但是無法避免linker 的警告. 因為只要include到 sim.h 的程式都會出現一個 unsigned char *filename; 的宣告 --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子======================================= sim.h #ifndef __sim__ #define __sim__ #include發表人 - cmf 於 2003/09/06 13:56:48 |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
======================================= sim.h #ifndef __sim__ #define __sim__ #include發表人 - cmf 於 2003/09/06 15:48:52
------
︿︿ |
cdklokBCB
一般會員 發表:15 回覆:27 積分:8 註冊:2003-02-19 發送簡訊給我 |
引言://--- 請問cmf大大... 加上#ifndef __sim__ #define __sim__ ... #endif 的真正意義是什麼呢?我去掉後好像也可以過... 另外..我知道使用extern的方法..但只有這個方法ㄇ?! 因為如此...我每個*.cpp要使用到filename..則必須都加上宣告 unsigned char *filename... 如此雖然都是共用一個...但好像就有點麻煩... 不像C如此方便...只要include到就可以用了...======================================= sim.h #ifndef __sim__ #define __sim__ #include發表人 - cmf 於 2003/09/06 15:48:52 有問題了... ----------------------------------- 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 發送簡訊給我 |
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 發送簡訊給我 |
引言:/---- 謝謝...參數部分是成功了.. 但是如果 -------------------------------- 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ㄇ... 謝謝...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 |
新手上路1234
一般會員 發表:3 回覆:24 積分:15 註冊:2002-12-27 發送簡訊給我 |
|
cdklokBCB
一般會員 發表:15 回覆:27 積分:8 註冊:2003-02-19 發送簡訊給我 |
|
新手上路1234
一般會員 發表:3 回覆:24 積分:15 註冊:2002-12-27 發送簡訊給我 |
|
cdklokBCB
一般會員 發表:15 回覆:27 積分:8 註冊:2003-02-19 發送簡訊給我 |
引言: 請把 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 發送簡訊給我 |
這是 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 發送簡訊給我 |
引言: 這是 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, 那就這樣改吧:我有個疑問..當我#include "io.c"時.. 就可使用io.c裡面的function了... 但我沒加上 #ifdef __cplusplus extern "C" #endif 總之還是謝謝各位大大的幫忙... 我已經把io.c改成io.cpp了... *_* forget me, is beginner...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 |
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 我有個疑問..當我#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 去使用. --- 小葵..小葵有很多的夢想 等待薰下班回家, 並準備晚飯跟洗澡水 薰回家的時候, 對你說一聲 歡迎回家 在休息的日子, 兩個人坐在屋外的走廊上, 品嚐著我親自作的點心 薰如果累了, 替他搥搥肩; 冷了, 和薰一起擠著被爐 但是, 但是... 小葵最大的心願是...成為薰的..成為薰的妻子 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |