我在XP SP3上使用10.05 mingw的代码块,我基本上在the mingw site on creating a dll and linking to it之后构建了dll和lib文件。我遇到的问题是我试图链接到库的第二部分。我创建了一个控制台应用程序并使用了以下源代码:
#include <stdio.h>
#include "example_dll.h"
int main(void)
{
hello("World");
printf("%d\n", Double(333));
CppFunc();
MyClass a;
a.func();
return 0;
}
然后我通过添加-L. -lexample_dll
来设置我的链接器设置,就像网站所说的那样,我也链接到库文件libexample_dll.a,就像我在许多其他已成功使用相同设置的库一样。然后,当我尝试链接可执行文件时,我收到错误,
C:\example_dll_client\example_dll_client.cpp|2|error: example_dll.h: No such file or directory|
C:\example_dll_client\example_dll_client.cpp||In function 'int main()':|
C:\example_dll_client\example_dll_client.cpp|6|error: 'hello' was not declared in this scope|
C:\example_dll_client\example_dll_client.cpp|7|error: 'Double' was not declared in this scope|
C:\example_dll_client\example_dll_client.cpp|8|error: 'CppFunc' was not declared in this scope|
C:\example_dll_client\example_dll_client.cpp|10|error: 'MyClass' was not declared in this scope|
C:\example_dll_client\example_dll_client.cpp|10|error: expected ';' before 'a'|
C:\example_dll_client\example_dll_client.cpp|11|error: 'a' was not declared in this scope|
||=== Build finished: 7 errors, 0 warnings ===|
我还包括用于构建dll和lib文件的两个文件(不是用于项目,而是用于此站点以供参考。我只有错误的源作为整个项目,否则dll的重点是什么是什么?)。
//example_dll.cpp
#include <stdio.h>
#include "example_dll.h"
__stdcall void hello(const char *s)
{
printf("Hello %s\n", s);
}
int Double(int x)
{
return 2 * x;
}
void CppFunc(void)
{
puts("CppFunc");
}
void MyClass::func(void)
{
puts("MyClass.func()");
}
//example_dll.h
#ifndef EXAMPLE_DLL_H
#define EXAMPLE_DLL_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef BUILDING_EXAMPLE_DLL
#define EXAMPLE_DLL __declspec(dllexport)
#else
#define EXAMPLE_DLL __declspec(dllimport)
#endif
void __stdcall EXAMPLE_DLL hello(const char *s);
int EXAMPLE_DLL Double(int x);
#ifdef __cplusplus
}
#endif
// NOTE: this function is not declared extern "C"
void EXAMPLE_DLL CppFunc(void);
// NOTE: this class must not be declared extern "C"
class EXAMPLE_DLL MyClass
{
public:
MyClass() {};
virtual ~MyClass() {};
void func(void);
};
#endif // EXAMPLE_DLL_H
编辑:
我对DLL和lib文件的编译做了以下更改。
我首先确保我的构建目标是一个动态库,可以在构建目标选项卡下找到,方法是右键单击项目管理器树中活动项目的属性。我还检查了创建导入库和检查.def导出文件。然后我进入了codeblocks构建选项,并在编译器设置 - &gt;其他选项选项卡中添加了
-c -shared
并在#defines标签下添加了
BUILDING_EXAMPLE_DLL BUILD_DLL
我的链接器设置在链接库和我的链接器设置下有user32 -mwindows --out-IMPLIB
现在,构建应该编译并链接,不会出现任何错误或警告。
为了使用int main()编译源代码,我包含了头文件以及这些设置:
在链接库下我有libexample_dll.dll.a,并且在我有
的链接器设置下-L。 -lexample_dll
答案 0 :(得分:3)
对我而言,看起来你有不同的exe和dll目录。
所以L.
不行。应该是LpointsToThelibexample_dll.aFolder
。
要么在exe目录中复制example_dll.h,要么使用-IpointsToTheexample_dll.hFolder
。
可以肯定的是,由于命令不正确,执行无效 我制作了一个makefile。
测试makefile
生成文件
# Environment
MKDIR=mkdir
CP=cp
CCADMIN=CCadmin
# build
builddll:
g++ -c -DBUILDING_EXAMPLE_DLL example_dll.cpp
g++ -shared -o example_dll.dll example_dll.o -Wl,--out-implib,libexample_dll.a
buildexe:
g++ -c example_exe.cpp
g++ -o example_exe.exe example_exe.o -L. -lexample_dll
clean:
rm -f libexample_dll.a example_exe.exe example_dll.dll
由于复制和粘贴错误。
在使用此makefile之前,请用两个选项卡替换命令前面的所有空白(g ++和rm)
或者你会得到这样的错误。 makefile:9: *** missing separator. Stop.
执行以下命令。
现在您可以测试example_exe.exe
只是因为完整性还有一个清洁。
<强>更新强>
如果要使用不带头文件的DLL,则必须知道所有DLL函数。
这是一个loadDll.cpp,它加载DLL并调用Double
。
/*
* File: loadDll.cpp
* Author: Administrator
*
* Created on 19. Februar 2013, 22:42
*/
#include <cstdlib>
#include <windows.h>
#include <stdio.h>
using namespace std;
typedef int (WINAPI *PFNDOUBLE)(int x);
PFNDOUBLE idlldouble;
HINSTANCE dllctrl_inst;
int main(int argc, char** argv) {
puts("---start---");
dllctrl_inst = LoadLibrary( "example_dll.dll" );
if( dllctrl_inst != NULL ) {
idlldouble = (PFNDOUBLE)GetProcAddress( dllctrl_inst, "Double" );
}
if( idlldouble != NULL ) {printf("%d\n", idlldouble(333));}
return 0;
}