[問題] code::blocks下編譯dll遇到問題

作者: icetofux   2017-04-26 20:35:01
開發平台(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):
作者: Sidney0503 (Sidney0503)   2017-04-26 21:15:00
win10上喔......建議換VS呵呵據我所知 並不需要extern 只要設好linker就可以抓到
作者: pttworld (批踢踢世界)   2017-04-26 23:49:00
extern "C" int AddExt .... 然後不需要add.h
作者: LPH66 (-6.2598534e+18f)   2017-04-26 23:58:00
我怎麼覺得這是你單純沒把 add.o 給連結起來的關係...你有把 add.c 加進專案裡面去嗎?
作者: pttworld (批踢踢世界)   2017-04-27 00:02:00
錯誤訊息告知走C rule了。
作者: icetofux   2017-04-27 01:06:00
有喔 我有確認所有檔案有加進專案了請問從哪裡可以看出走c rule呢
作者: pttworld (批踢踢世界)   2017-04-27 05:43:00
google extern 用法,extern "C"
作者: icetofux   2017-04-27 09:22:00
喔,我知道extern "C"的用途,我以為你說的錯誤訊息是編譯器輸出有提到。謝謝。
作者: kwpn (ITSST)   2017-04-27 19:20:00
用extern "C" 或是把add.c改成add.cpp
作者: LPH66 (-6.2598534e+18f)   2017-04-27 20:55:00
其實算有喔, 因為 C linkage 和 C++ linkage 連結器看到的名字 mangling 的方式是不一樣的 (這也是 extern "C" 實際上所做的手腳) 你所給的連結器錯誤訊息表示它找不到 C++ 版的函數, 這就表示你這函數在 main.o 裡是 C++ linkage(之所以知道是 C++ 版是因為它寫出了參數型態)

Links booklink

Contact Us: admin [ a t ] ucptt.com