以下代码均在codeblocks下生成。
以下是本人编译生成的动态库STOCK.DLL的头文件STOCK.H,STOCK.CPP就不贴了。
以下是本人编译生成的动态库STOCK.DLL的头文件STOCK.H,STOCK.CPP就不贴了。
#ifndef __STOCK_H__ #define __STOCK_H__ class Stock { private: char company[30]; int shares; double share_val; double total_val; void set_tot(){total_val = shares*share_val;} public: Stock(); Stock(const char * co, int n = 0, double pr = 0.0); ~Stock() {} void buy(int num, double price); void sell(int num, double price); void update(double price); void show()const; const Stock & topval (const Stock & s) const; }; #endif
之后本人准备调用该动态库,新建一TEST工程,main.cpp如下:
#include <iostream> #include "stock.h" using namespace std; int main() { Stock newStock; return 0; }
编译的时候提示undefined reference to `Stock::Stock()”,提示该构造函数未定义
本人的理解是应该先
1. LoadLibrary()或dlopen()
2.GetProcAddress()或dlsym()
3.FreeLibrary或dlclose()
这样才能调用类中的构造函数,对吗?但是dlsym()中第二个参数:函数名 应该怎么填写,假如这样写代码量也特多了!
不清楚C++动态库中的类,应该怎么样在其他工程中调用,希望高手指点一下 研究一天了
解决方案
5
#pragma comment(lib,”.\sqlite3.lib”);
这个?
这个?
5
用LoadLibrary动态加载并使用C++的dll是很麻烦的。建议你还是静态加载吧。
10
假如使用显式加载,那么动态库导出一定要是函数,假如希望导出类,那就只能隐式加载
5
利用纯虚类做接口,通过编译器生成的vptr/vtbl调用,避免abi问题。
手工的话还是得转成C接口,可以集中到结构体里。初始化时返回结构体指针。调用时手工完成this指针传递与类型转换(一般会作为void*保存在结构体里)。
手工的话还是得转成C接口,可以集中到结构体里。初始化时返回结构体指针。调用时手工完成this指针传递与类型转换(一般会作为void*保存在结构体里)。