好急呀!静态库和动态库的问题。高手帮帮忙呀!

wooingcn 2001-12-24 10:54:34
我有三个工程:
Prj1,Prj2,Prj3
Prj1是扩展动态库,里面有一个导出对话框类 CXXXDlg,
Prj2是个静态链接库,在其中有个XXXFunc函数,使用Prj1中的CXXXDlg类,编译无错通过。
Prj3是个动态库,在其中使用XXXFunc函数,结果编译时出错,出错信息为:
Prj1.lib(Prj1.dll) : error LNK2005: "public: virtual __thiscall CxxxDlg::~CxxxDlg(void)" (??1CxxxDlg@@UAE@XZ) already defined in xxxCommands.obj
Prj1.lib(Prj1.dll) : warning LNK4006: "public: virtual __thiscall CXXXDlg::~CXXXDlg(void)" (??1CXXXDlg@@UAE@XZ) already defined in xxxCommands.obj; second definition ignored
Creating library Release/fastRoadDesign.lib and object Release/fastRoadDesign.exp
Release/fastRoadDesign.arx : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.
...全文
220 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
redteasoft 2001-12-27
  • 打赏
  • 举报
回复
到msdn.microsoft.com上去用“LNK2005”SEARCH一把

add Prj1.LIB to "Ignore libraries" in Project Settings (tab
"Link")

wooingcn 2001-12-27
  • 打赏
  • 举报
回复
又开始沉了,大家帮我推一下吧。谢了。
wooingcn 2001-12-27
  • 打赏
  • 举报
回复
还是没解决,牛人快来呀。
静态库调用了动态库,这个静态库能被别的动态库调用吗?能的话,要注意什么?
wooingcn 2001-12-27
  • 打赏
  • 举报
回复
散分
wooingcn 2001-12-27
  • 打赏
  • 举报
回复
解决,但还没有彻底解决,我估计是VC的Bug,谁能帮我到ms的网站上去问一下。e文我也写好了,说明一下,我的e文不太好,贴出来不要笑话,有错的地方请帮我改一下。
I have 3 projects;
The Prj1 is a MFC Extensopm DLL,there is a class(CTestDlg)in DLL.
The Prj2 is a static Lib.there is a function (Test) in Lib,and I have used CTestDlg in this function;
The Prj3 is a DLL,When I use the Test function in the test.cpp file of Prj3,The Compiler report following errors:

Compiling...
test.cpp
Linking...
Prj1.lib(Prj1.dll) : error LNK2005: "public: virtual __thiscall CTestDlg::~CTestDlg(void)" (??1CTestDlg@@UAE@XZ) already defined in Test.obj
Prj1.lib(Prj1.dll) : warning LNK4006: "public: virtual __thiscall CTestDlg::~CTestDlg(void)" (??1CTestDlg@@UAE@XZ) already defined in Test.obj; second definition ignored
Creating library Release/Prj3.lib and object Release/Prj3.exp
Release/Prj3.Dll : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.
Creating browse info file...
Prj3.dll - 2 error(s), 1 warning(s)
If I select the Force File output option.Compiling can pass,but have some warning.
code_cold 2001-12-25
  • 打赏
  • 举报
回复
帮忙Up+Push
http://www.csdn.net/Expert/topic/439/439303.shtm
wooingcn 2001-12-25
  • 打赏
  • 举报
回复
又石沉大海啦。
wooingcn 2001-12-25
  • 打赏
  • 举报
回复
晾了一天了,没进展。
wooingcn 2001-12-24
  • 打赏
  • 举报
回复
Win32 static Library
han012 2001-12-24
  • 打赏
  • 举报
回复
你的prj2是个什么样的静态DLL呀? 是
Win32 static Library 还是
Regular DLL with MFC statically linked?
wooingcn 2001-12-24
  • 打赏
  • 举报
回复
继续呀
wooingcn 2001-12-24
  • 打赏
  • 举报
回复
to turongguo(无痕雨),谢谢你,搞来这么多东东,我是静态使用,我看没有问题的,但还是不行。
turongguo 2001-12-24
  • 打赏
  • 举报
回复
请你检查是否按照如下方法做了:
DLL的使用分为两种,静态导入和动态导入DLL。其中整个类的导入常采用
静态的导入方法;而函数或方法的导入通常采用动态的导入方法。
一.静态使用
导入类的声明:
1.DLL工程的声明最好为扩展MFC类型;
2.在DLL中有以下类声明
//MyClass.h
class AFX_EXT_CLASS CMyClass
{
............

};
3.在使用DLL的类的工程中,需要以下配置
A.在Project|Setting中的Link标签页的Object/library Modules 中加入*.lib
B.在Tools|Options中的Directories 标签页中的 Show directories for:下面的
Include files 中增加Myclass.h的路径;Lib files中增加*.lib 和*.dll路径。
C.在使用工程的代码中如下即可:
#include "MyClass.h"
......
CMyClass MyClass;
二.动态使用
动态使用DLL有个前提条件,必须知道DLL中的待引用函数名,配置必须有静态使用中的B项。
使用如下:
HINSTANCE g_hSmppDll = NULL;
typedef UINT MyFunc(char *); //DLL中的函数
MyFunc *pMyFunc=NULL;
g_hSmppDll =LoadLibrary("MyDll.dll");
ASSERT(g_hSmppDll );
pMyFunc=(MyFunc *)(GetProcAddress( g_hSmppDll, "MyFunc"));//引号中为DLL中的函数名
(*pMyFunc) ("ok");

在于一个*.lib文件。在编译动态链接库时,VC++会为动态链接库创建一个引入
库(IMPORT LIB),即*.lib。库文件中只包含一些指向外部DLL库的函数索引指针,而
不是真正的代码,用于解析DLL的加载地址,并定义动态链接库和用于声明的头文件
的完全路径名。然后为引入库定义一个头文件,用来声明DLL中的函数。开发人员在引用时,
要配置如下:
A.在Project|Setting中的Link标签页的Object/library Modules 中加入*.lib
B.在Tools|Options中的Directories 标签页中的 Show directories for:下面的
Include files 中增加Myclass.h的路径;Lib files中增加*.lib 和*.dll路径。
这是一种常用的方法。实际上,应用程序就是通过这种方式来访问Windows 的API函数。
WINDOWS为其内核动态链接库生成引入库并提供了头文件。应用程序在编译时将引入
库的信息带入可执行文件中,运行时通过引入库信息访问API函数。
wooingcn 2001-12-24
  • 打赏
  • 举报
回复
谢谢xiaoxiaohan(萧晓寒),但我这好像不是编译的问题,而是链接时的问题。而且三个工程都是独立的,相互之间只有*.lib 和*.h文件关联,它说有编译符号重定义,怎么会这样呀??
xiaoxiaohan 2001-12-24
  • 打赏
  • 举报
回复
可能是编译顺序不对,有时三个工程互相包含了,结果编译总是有问题。
你整理一下,改变顺序编译一下,如果还不行,就把工程中互相包含的语句注释掉。重新编译,再一点一点的加上互相包含的语句,这中间有一些技巧,你得自己体会。
wooingcn 2001-12-24
  • 打赏
  • 举报
回复
SORRY, TOO LONG!!!!!,好多M,不太方便。我想问一下:静态库调用了动态库,这个静态库能被别的动态库调用吗?能的话,要注意什么?xie xie
han012 2001-12-24
  • 打赏
  • 举报
回复
你的问题, 可能不是一句两句能说明的. 猜也不一定猜得对
需要分析源代码, 如果你愿意可以发源码给我,或直接贴出来.
mail: hanjin@pecan.com.cn
wooingcn 2001-12-24
  • 打赏
  • 举报
回复
我也怀疑,可是没有呀。
NowCan 2001-12-24
  • 打赏
  • 举报
回复
prj3是不是和prj1包含了相同的文件(xxxCommands.cpp)?
wooingcn 2001-12-24
  • 打赏
  • 举报
回复
还没有解决呀。
加载更多回复(1)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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