作者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/cn.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