动态库调用静态库

sybaselu 2006-10-09 10:35:58
1 用一个DLL去封装一个已经静态库LIB有问题吗?
static lib提供的接口:
void libfun1();
void libfun2();

dynamic dll用到static lib的接口:
void dllfun1() { libfun1(); }
void dllfun2() { libfun2(); }

2 如果EXE使用静态库lib中的接口(不是DLL),在EXE被调用内存(或部分调用内存)中,她是如何调用静态库Lib中的函数的(如何找到函数在静态库中的相应的物理地址的)。最终EXE的大小肯定大于静态库Lib吗?此时静态库Lib与EXE已经合成一体?
3 如果EXE使用动态库DLL中的接口(是隐式调用),那么EXE与DLL在内存的分配是两个部分,不是一体的,这样当EXE使用DLL中的接口时, 已经在编译过程中DLL的根据导出符号表*.lib知道了DLL中函数的物理地址的,从而在运行时知道如何调用相应的函数。
...全文
533 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sybaselu 2006-10-10
  • 打赏
  • 举报
回复
1 DLL1是一个“Use MFC in a static Library", 而LIB1是”Not use MFC“, DLL2也是”Not use MFC“, LBI2是“Use MFC in a static Library"。
2 如果静态库LIB1使用LIB2, LIB2是2M, 那么LIB1大于2M吗?
3 有这么一段代码:
...
CString win32FileName = CString(pModuleName) + ".dll";

HINSTANCE hInstance = ::LoadLibrary((const char *)win32FileName);

// dll load failed, try to get the proc from the application instance
// (statically linked in)
if (hInstance == NULL)
{
bFreeHInstance = false;
hInstance = AfxGetInstanceHandle();
}

if (hInstance == NULL) return 0;

CString initProcName;
InitProc * pProc = (InitProc *)::GetProcAddress(hInstance, (const char *)initProcName)
...
如果将这段代码做成静态库LIB2, 如果再用一个DLL1使用LIB2,那么当用EXE使用DLL1时, 结果会出错吗?
sybaselu 2006-10-09
  • 打赏
  • 举报
回复
遇到过这样的问题:
LIB库:
void libfun1() {};
void libfun2() {};

DLL库:
void dllfun1() { libfun1(); }
void dllfun2{} { libfun2(); }

EXE:
int main()
{
...
dllfun1();
...
}
当执行到libfun1()中时,发现在libfun1()中使用了一个GetProcAddress()函数获得一个函数的物理地址时,返回了0x000000000。最终出错了
DentistryDoctor 2006-10-09
  • 打赏
  • 举报
回复
静态库也可以直接链接静态库的。

1 编译DLL有问题(试过换nafxcwd.lib的次序)
nafxcwd.lib(afxmem.obj) : error LNK2005: "public: static void __stdcall CObject::operator delete(void *)" (??3CObject@@SGXPAX@Z) already defined in CATV.obj
nafxcwd.lib(afxinl1.obj) : error LNK2005: "public: virtual void __thiscall CObject::Serialize(class CArchive &)" (?Serialize@CObject@@UAEXAAVCArchive@@@Z) already defined in CATV.obj
nafxcwd.lib(afxinl3.obj) : error LNK2005: "protected: virtual void __thiscall CWnd::DoDataExchange(class CDataExchange *)" (?DoDataExchange@CWnd@@MAEXPAVCDataExchange@@@Z) already defined in ZipcodeDlg.obj
nafxcwd.lib(afxinl3.obj) : error LNK2005: "public: virtual void __thiscall CWnd::BeginModalState(void)" (?BeginModalState@CWnd@@UAEXXZ) already defined in CATVDlg.obj
nafxcwd.lib(afxinl3.obj) : error LNK2005: "public: virtual void __thiscall CWnd::EndModalState(void)" (?EndModalState@CWnd@@UAEXXZ) already defined in CATVDlg.obj

应该是动态库与静态库在使用MFC DLL的选项设置不一致

2.应该是
3.DLL2的导出符号表DLL2Name.lib?不是有DLL1/Lib1么,怎么又出来个DLL2?
sybaselu 2006-10-09
  • 打赏
  • 举报
回复
情况是这样的:
在DLL1中使用了静态库LIB1, 而LIB1中使用一个动态库DLL2和一个静态库LIB2(一切正常,因为用一个EXE测试使用LIB1,返回正常结果).现在问题是:
1 编译DLL有问题(试过换nafxcwd.lib的次序)
nafxcwd.lib(afxmem.obj) : error LNK2005: "public: static void __stdcall CObject::operator delete(void *)" (??3CObject@@SGXPAX@Z) already defined in CATV.obj
nafxcwd.lib(afxinl1.obj) : error LNK2005: "public: virtual void __thiscall CObject::Serialize(class CArchive &)" (?Serialize@CObject@@UAEXAAVCArchive@@@Z) already defined in CATV.obj
nafxcwd.lib(afxinl3.obj) : error LNK2005: "protected: virtual void __thiscall CWnd::DoDataExchange(class CDataExchange *)" (?DoDataExchange@CWnd@@MAEXPAVCDataExchange@@@Z) already defined in ZipcodeDlg.obj
nafxcwd.lib(afxinl3.obj) : error LNK2005: "public: virtual void __thiscall CWnd::BeginModalState(void)" (?BeginModalState@CWnd@@UAEXXZ) already defined in CATVDlg.obj
nafxcwd.lib(afxinl3.obj) : error LNK2005: "public: virtual void __thiscall CWnd::EndModalState(void)" (?EndModalState@CWnd@@UAEXXZ) already defined in CATVDlg.obj
2 如果编译通过,那么DLL1的大小将大于LIB1吗?
3 为什么在编译链接时DLL1时还需要静态库LIB2和DLL2的导出符号表DLL2Name.lib?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧