作者icetofux ()
看板C_and_CPP
標題[問題] code::blocks下編譯dll遇到問題
時間Wed Apr 26 20:35:01 2017
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1493210103.A.788.html
1F:推 Sidney0503: win10上喔......建議換VS呵呵 04/26 21:15
2F:推 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
3F:→ pttworld: extern "C" int AddExt .... 然後不需要add.h 04/26 23:49
4F:推 LPH66: 我怎麼覺得這是你單純沒把 add.o 給連結起來的關係... 04/26 23:58
5F:→ LPH66: 你有把 add.c 加進專案裡面去嗎? 04/26 23:59
6F:→ pttworld: 錯誤訊息告知走C rule了。 04/27 00:02
7F:→ icetofux: 有喔 我有確認所有檔案有加進專案了 04/27 01:06
8F:→ icetofux: 請問從哪裡可以看出走c rule呢 04/27 01:08
9F:→ pttworld: google extern 用法,extern "C" 04/27 05:43
10F:→ icetofux: 喔,我知道extern "C"的用途,我以為你說的錯誤訊息 04/27 09:22
11F:→ icetofux: 是編譯器輸出有提到。謝謝。 04/27 09:23
12F:推 kwpn: 用extern "C" 或是把add.c改成add.cpp 04/27 19:20
13F:→ LPH66: 其實算有喔, 因為 C linkage 和 C++ linkage 連結器看到的 04/27 20:55
14F:→ LPH66: 名字 mangling 的方式是不一樣的 (這也是 extern "C" 實際 04/27 20:55
15F:→ LPH66: 上所做的手腳) 你所給的連結器錯誤訊息表示它找不到 C++ 版 04/27 20:55
16F:→ LPH66: 的函數, 這就表示你這函數在 main.o 裡是 C++ linkage 04/27 20:56
17F:→ LPH66: (之所以知道是 C++ 版是因為它寫出了參數型態) 04/27 20:57