[问题] 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