怎么找到这些lib文件?

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
liuqi5521
Earned some good credits
Earned some good credits
Posts: 103
Joined: Thu Apr 03, 2008 5:35 am
Location: China
Contact:

怎么找到这些lib文件?

Post by liuqi5521 »

我用的IDE是wxDev-C++。以前一直用它默认的gcc来编译。今天想给换成VC2005的编译器来编译,结果编译能通过,但是链接不成功,找不到这些lib文件,我看了一下wxDev-C++的安装目录下并没有这些文件。我下载了wxMSW2.8.9安装后也没有找到这些lib文件。请问在哪里能够找到这些文件呢?还是说需要我用wxMSW的代码来自己编译出这些文件呢?如果是后者,我是不是需要用VC2005来编译出这些静态链接库呢?

wxmsw28.lib
wxmsw28_gl.lib
wxtiff.lib
wxjpeg.lib
wxpng.lib
wxzlib.lib
wxregex.lib
wxexpat.lib
kernel32.lib
user32.lib
gdi32.lib
comdlg32.lib
winspool.lib
winmm.lib
shell32.lib
comctl32.lib
ole32.lib
oleaut32.lib
uuid.lib
rpcrt4.lib
advapi32.lib
wsock32.lib
odbc32.lib
opengl32.lib
Utensil
Moderator
Moderator
Posts: 423
Joined: Sun Feb 03, 2008 11:38 am
Location: China

Post by Utensil »

wxDev只自带了MinGW版的wxWidgets,想用VC版的要自己编译。打开build/msw里的工程,按照自己需要调整一下编译选项,然后编译就可以了。也不会太麻烦,不过要编半个小时多。

-Utensil
In fascination of creating worlds by words, and in pursuit of words behind the world.

On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
liuqi5521
Earned some good credits
Earned some good credits
Posts: 103
Joined: Thu Apr 03, 2008 5:35 am
Location: China
Contact:

Post by liuqi5521 »

谢谢已经成功了!

不过用VC2005编译出的程序怪怪的。比如说,同样的代码,用gcc编译就好好的,用VC2005编译出的程序一运行就崩溃。
liuqi5521
Earned some good credits
Earned some good credits
Posts: 103
Joined: Thu Apr 03, 2008 5:35 am
Location: China
Contact:

Post by liuqi5521 »

经过试验发现:对于简单的程序,比如一个窗口上拖上两个按钮,用gcc和VC2005编译效果一样。

稍微复杂一点,放个Timer,实时的刷新Static控件,用VC2005编译出的程序一运行就崩溃。gcc编译的就正常。

另一个更复杂一些的工程,用gcc编译的,做了很久了。今天换成vc2005的编译器,发现编译通不过,提示:

F:\wxDev-Cpp projects\SegunStrongBox\SafeBoxGUI2\afxmem.obj [Error LNK2005] "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMT.lib(new.obj) 中定义
F:\wxDev-Cpp projects\SegunStrongBox\SafeBoxGUI2\afxmem.obj [Error LNK2005] "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) 已经在 LIBCMT.lib(delete.obj) 中定义
F:\wxDev-Cpp projects\SegunStrongBox\SafeBoxGUI2\afxmem.obj [Error LNK2005] "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) 已经在 libcpmt.lib(newaop.obj) 中定义
F:\wxDev-Cpp projects\SegunStrongBox\SafeBoxGUI2\afxmem.obj [Error LNK2005] "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) 已经在 LIBCMT.lib(delete2.obj) 中定义

正在寻求解决方法。
Utensil
Moderator
Moderator
Posts: 423
Joined: Sun Feb 03, 2008 11:38 am
Location: China

Post by Utensil »

这种崩溃有可能是:

1)编译你的程序时,用的是VC的lib;

2)运行程序时,由于PATH当中的是gcc的dll,它奇迹般地去调用了gcc的dll所以崩溃。

只是一个猜测,我以前曾经遭遇过这样的奇怪问题(奇怪的行为以及偶然性的崩溃),后来才发现是因为重新编译了SVN版的wxWidgets,却没有更新路径中的dll。

虽然我非常热爱gcc,但我得承认专注于Windows的VC在2500+之后编译速度,生成的体积都比gcc要好些,所以这种不稳定、崩溃,一定是什么地方做错了,它本来不是这样的。再检查一下,说不定是在细小的步骤里。

-Utensil
In fascination of creating worlds by words, and in pursuit of words behind the world.

On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
liuqi5521
Earned some good credits
Earned some good credits
Posts: 103
Joined: Thu Apr 03, 2008 5:35 am
Location: China
Contact:

Post by liuqi5521 »

果然如你所说。并不是VC2005的错。是我的代码有问题。gcc比vc2005要宽容得多,所以让我的代码运行了很久,一换成vc2005问题就暴露出来了。

事情源于一个字符串的格式化:
wxString::Format(
"完成 %d% 剩余 %0.0f 字节 剩余 %0.0f 秒 速率 %0.2f MB/s ",percent,
(float)remain,(float)remain/(float)speed ,
speed / 1024.0 /1024.0));

第二个百分号我的本意是要显示一个百分号在里面。结果却写错了,应该连用两个百分号来表示一个百分号,正确的写法是:
wxString::Format(
"完成 %d%% 剩余 %0.0f 字节 剩余 %0.0f 秒 速率 %0.2f MB/s ",percent,
(float)remain,(float)remain/(float)speed ,
speed / 1024.0 /1024.0));

我一开始就用的第一种写法,用gcc编译运行没有问题(比较宽容),运行结果也看似正确。换成vc2005后,vc2005就不干了,让程序崩溃了。
liuqi5521
Earned some good credits
Earned some good credits
Posts: 103
Joined: Thu Apr 03, 2008 5:35 am
Location: China
Contact:

Post by liuqi5521 »

至于第二个问题,链接的时候new和delete重复定义。我暂时还没有找到原因。目前正在参考微软的相关文档做一些实验。
liuqi5521
Earned some good credits
Earned some good credits
Posts: 103
Joined: Thu Apr 03, 2008 5:35 am
Location: China
Contact:

Post by liuqi5521 »

按照微软网站上提供的解决link2005错误的方法,解决了第二个问题。

微软提供的方法是:
------------------------------------------------------------
解决方案一:强制链接器按照正确的顺序链接库
1.
在“项目”菜单上,单击“设置”。
2. 在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。
3. 在“链接”选项卡上,单击以选中“类别”组合框中的“输入”。
4. 在“忽略库”框中,插入库名(例如,Nafxcwd.lib;Libcmtd.lib)。

注意:等效的链接器命令行是:/NOD:<library name>。
5. 在“对象/库模块”框中,插入库名。必须确保这些库按顺序列出,而且是行中的前两个库(例如,Nafxcwd.lib 和 Libcmtd.lib)。
-------------------------------------------------------------

目前是暂时抑制了问题。但是问题产生的原因我还不清楚,我的好几个工程,包括新建的工程,都没有这方面问题,为什么单单这一个项目就有这个问题呢,这一点是我百思不得其解的地方。也许将来有一天会知道吧!
Post Reply