看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Win10 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GUN GCC Compiler 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 沒有 問題(Question): 在製作DLL的時候,如果我把function放在main.cpp時(如下面程式碼中的AddInt()) 可以正常編譯,但是若放在其他檔案時(如下面程式碼中的AddExt())會編譯失敗。 我想應該是編譯環境路徑設定的問題,可是不清楚要改哪個部分,想問問看有沒有人 有類似經驗。 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) .\add.h // 我寫的function header. int AddExt(const int, const int); .\add.c // 我寫的function. #include "add.h" int AddExt(const int a, const int b) { return (a+b); } .\main.h // Code::Blocks DLL 專案自動產生,我修改部分內容。 // 部分註解跟前置處理器忽略的部分我沒貼上。 #ifndef __MAIN_H__ #define __MAIN_H__ #include "add.h" // 我增加的部分 #include <windows.h> #define DLL_EXPORT __declspec(dllexport) int DLL_EXPORT SomeFunction(const int, const int); #endif .\main.cpp // Code::Blocks DLL 專案自動產生,我修改部分內容。 // 部分註解跟前置處理器忽略的部分我沒貼上。 #include "main.h" static int AddInt(const int a, const int b) { return (a+b); } extern int AddExt(const int, const int); int DLL_EXPORT SomeFunction(const int a, const int b) { //return (AddInt(a,b)); // OK //return (a+b); // OK return (AddExt(a,b)); // 編譯不過,錯誤訊息如下。 } extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; } 錯誤訊息: obj\Release\main.o:main.cpp|| undefined reference to `AddExt(int, int)' 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.98.137 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1493210103.A.788.html
Sidney0503: win10上喔......建議換VS呵呵 04/26 21:15
Sidney0503: 據我所知 並不需要extern 只要設好linker就可以抓到 04/26 21:18
只要把#include "add.h"換個地方,問題就非常神奇的解決了。 .\main.h // Code::Blocks DLL 專案自動產生,我修改部分內容。 // 部分註解跟前置處理器忽略的部分我沒貼上。 #ifndef __MAIN_H__ #define __MAIN_H__ #include <windows.h> #define DLL_EXPORT __declspec(dllexport) #include "add.h" // 改放在這裡就能編譯過了。 int DLL_EXPORT SomeFunction(const int, const int); #endif 放在這兩個地方感覺上應該沒有什麼不同,畢竟兩者之間只差了一個#define語句, 我也搞不太懂為什麼,留給高手解答吧。 VS商業使用要錢的Orz ※ 編輯: icetofux (220.132.98.137), 04/26/2017 21:28:10
pttworld: extern "C" int AddExt .... 然後不需要add.h 04/26 23:49
LPH66: 我怎麼覺得這是你單純沒把 add.o 給連結起來的關係... 04/26 23:58
LPH66: 你有把 add.c 加進專案裡面去嗎? 04/26 23:59
pttworld: 錯誤訊息告知走C rule了。 04/27 00:02
icetofux: 有喔 我有確認所有檔案有加進專案了 04/27 01:06
icetofux: 請問從哪裡可以看出走c rule呢 04/27 01:08
pttworld: google extern 用法,extern "C" 04/27 05:43
icetofux: 喔,我知道extern "C"的用途,我以為你說的錯誤訊息 04/27 09:22
icetofux: 是編譯器輸出有提到。謝謝。 04/27 09:23
kwpn: 用extern "C" 或是把add.c改成add.cpp 04/27 19:20
LPH66: 其實算有喔, 因為 C linkage 和 C++ linkage 連結器看到的 04/27 20:55
LPH66: 名字 mangling 的方式是不一樣的 (這也是 extern "C" 實際 04/27 20:55
LPH66: 上所做的手腳) 你所給的連結器錯誤訊息表示它找不到 C++ 版 04/27 20:55
LPH66: 的函數, 這就表示你這函數在 main.o 裡是 C++ linkage 04/27 20:56
LPH66: (之所以知道是 C++ 版是因為它寫出了參數型態) 04/27 20:57