轉(zhuǎn)載:http://blog.sina.com.cn/s/blog_6a961ad40100kiey.html
.NET2005:
空白工程新建DLL后,將DLL和LIB文件放入需要調(diào)用的“指定目錄”
項(xiàng)目-》屬性->連接器-》常規(guī)-》附加庫(kù)目錄->添加“指定目錄”
項(xiàng)目-》屬性->連接器-》輸入-》附加依賴項(xiàng)->添加“LIB文件”
添加頭文件到項(xiàng)目中,則DLL可用!
VC6.0:
使一個(gè)項(xiàng)目編譯生成DLL庫(kù)而不生成可執(zhí)行文件:
刪除main()方法;
將.pro項(xiàng)目文件中的TEMPLATE = app改為TEMPLATE = lib。
然后編譯,此時(shí)生成的就是.a和.dll的文件。
在另一個(gè)項(xiàng)目中調(diào)用此DLL:
在項(xiàng)目文件中添加LIB。如添加此行:LIBS += 'D:\workspace\MRP_Common\debug\common.dll' (common.dll既是上面生成的DLL);
復(fù)制dll中類或方法的頭文件到該項(xiàng)目中,并在要調(diào)用common.dll中類或方法的文件上面include;
make,在debug目錄中生成可執(zhí)行文件,然后將dll復(fù)制到debug中,運(yùn)行。
例子:
- ########################### 生成DLL的工程: #######################
- 修改pro文件: TEMPLATE=lib
-
- ########################### .h文件 #######################
- #ifndef DLLTEST_H
- #define DLLTEST_H
-
- #ifdef Q_WS_WIN
- #define MY_EXPORT __declspec(dllexport)
- #else
- #define MY_EXPORT
- #endif
- class DllTest {
- public:
- DllTest();
- int getAge() {
- return 10;
- }
- };
-
- extern 'C' MY_EXPORT int add(int a, int b) {
- return a + b;
- }
-
- extern 'C' MY_EXPORT DllTest* getDllTest(); // 使用類
-
- #endif // DLLTEST_H
- ########################### .cpp文件 #######################
- #include 'dlltest.h'
- #include <qDebug>
-
- DllTest::DllTest() {
- qDebug() << 'Shared Dll Test';
- }
-
- DllTest* getDllTest() {
- return new DllTest();
- }
-
- // 如果是C++編譯的函數(shù), 要使用extern 'C'來包裝成C函數(shù)(導(dǎo)出函數(shù), 給外部提供服務(wù)).
########################### 生成DLL的工程: ####################### 修改pro文件: TEMPLATE=lib
########################### .h文件 ####################### #ifndef DLLTEST_H #define DLLTEST_H
#ifdef Q_WS_WIN #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif class DllTest { public: DllTest(); int getAge() { return 10; } };
extern 'C' MY_EXPORT int add(int a, int b) { return a + b; }
extern 'C' MY_EXPORT DllTest* getDllTest(); // 使用類
#endif // DLLTEST_H ########################### .cpp文件 ####################### #include 'dlltest.h' #include <qDebug>
DllTest::DllTest() { qDebug() << 'Shared Dll Test'; }
DllTest* getDllTest() { return new DllTest(); }
// 如果是C++編譯的函數(shù), 要使用extern 'C'來包裝成C函數(shù)(導(dǎo)出函數(shù), 給外部提供服務(wù)).
- ########################### 使用DLL的工程: #######################
- pro文件中加入: LIBS += 'DllTest.dll'
-
- ########################### 測(cè)試.cpp文件 #######################
- #include 'dlltest.h'
- #include <QLibrary>
- #include <qDebug>
- #include <QApplication>
-
- typedef int (*AddFunc)(int, int);
- typedef DllTest* (*GetFunc)();
-
- int main(int argc, char* argv[]) {
- QApplication app(argc, argv, false);
- QLibrary lib('DllTest');
- if (lib.load()) {
- qDebug() << 'Load dll successfully.';
- AddFunc func = (AddFunc)lib.resolve('add');
- if (func) {
- qDebug() << func(1, 3);
- }
-
- GetFunc g = (GetFunc)lib.resolve('getDllTest');
- if (g) {
- DllTest *t = g(); // 使用DLL中的類
- qDebug() << t->getAge();
- delete t;
- }
- } else {
- qDebug() << 'Load dll Failed';
- }
-
-
- return app.exec();
- }
########################### 使用DLL的工程: ####################### pro文件中加入: LIBS += 'DllTest.dll'
########################### 測(cè)試.cpp文件 ####################### #include 'dlltest.h' #include <QLibrary> #include <qDebug> #include <QApplication>
typedef int (*AddFunc)(int, int); typedef DllTest* (*GetFunc)();
int main(int argc, char* argv[]) { QApplication app(argc, argv, false); QLibrary lib('DllTest'); if (lib.load()) { qDebug() << 'Load dll successfully.'; AddFunc func = (AddFunc)lib.resolve('add'); if (func) { qDebug() << func(1, 3); }
GetFunc g = (GetFunc)lib.resolve('getDllTest'); if (g) { DllTest *t = g(); // 使用DLL中的類 qDebug() << t->getAge(); delete t; } } else { qDebug() << 'Load dll Failed'; }
return app.exec(); }
|