大家好,请问编译后不要mingwm10.dll的方式? Topic is solved

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
spritez
Earned a small fee
Earned a small fee
Posts: 21
Joined: Sat Apr 19, 2008 2:16 pm
Location: china

大家好,请问编译后不要mingwm10.dll的方式?

Post by spritez »

我在使用单线程编译时,即没有使用-mthreads 时,编译后的可执行文件不需要mingwm10.dll就可单独运行,但是,我做多线程的工程时,加入了-mthreads标志后,编译的结果在运行时要求mingwm10.dll文件存在。

请问,如何能编译出不依赖mingwm10.dll文件就可运行的目标文件?

谢谢。 :?: :?: :?:
*** china ***
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 »

静态链接就可以了吧
spritez
Earned a small fee
Earned a small fee
Posts: 21
Joined: Sat Apr 19, 2008 2:16 pm
Location: china

Post by spritez »

liuqi5521 wrote:静态链接就可以了吧
我一直都使用静态连接方式,在我未使用-mthreads参数编译前,产生的目标文件.exe 是不需要mingwm10.dll就可以运行的,今天,我将程序改为多线程的了,编译时使用了-mthreads参数,产生的.exe文件运行时提示没有找到mingwm10.dll文件。 :cry: :cry: :cry:

有遇到同样问题的吗?谢谢啦!
*** china ***
Utensil
Moderator
Moderator
Posts: 423
Joined: Sun Feb 03, 2008 11:38 am
Location: China

Post by Utensil »

应该是-mthread引起了gcc相关选项的重设。

你试试在-mthread之后,加上-static和-static-libgcc试试。

-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/
spritez
Earned a small fee
Earned a small fee
Posts: 21
Joined: Sat Apr 19, 2008 2:16 pm
Location: china

Post by spritez »

Utensil wrote:应该是-mthread引起了gcc相关选项的重设。

你试试在-mthread之后,加上-static和-static-libgcc试试。

-Utensil
已经加了,还是不行,我用CB编译了一下,就可以不依赖Dll文件了,但,我从CB的选项看了看,也没发现什么特别的地方。我是用makefile编译的,我不知道如何将cb的编译选项生成makefile文件。

今天在网上搜了下,发现mingwm10.dll文件的使用确实和多线程有关,也有人提出人工的解决方案,参看:http://www.nabble.com/Removing-dependen ... 82051.html

但是CB确没有这样,编译后也不再需要mingwm10.dll文件,不知道是怎样做的。 :?: :?: :?:
*** china ***
Utensil
Moderator
Moderator
Posts: 423
Joined: Sun Feb 03, 2008 11:38 am
Location: China

Post by Utensil »

CB其实是需要的,如果你直接从bin下面那个运行,你就会发现它报缺dll。如果你用Ctrl+F10运行是感觉不到的。CB是使用了自己的mingwm10.dll来帮你运行。


P.S.你那个链接给我一个启示,静态链接是不能良好地处理C++异常的,而多线程又需要异常处理,所以……(我指的是-static-libgcc而不是-static,两者有本质不同)

-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/
spritez
Earned a small fee
Earned a small fee
Posts: 21
Joined: Sat Apr 19, 2008 2:16 pm
Location: china

Post by spritez »

这算是解决了?

我用CB编译完后,都是在另一个没有安装过MinGW的系统中运行的。确定是可以正常运行的。另外,我也使用了-static-libgcc参数。当然,还是不行。

不过,我在网上搜索的时候,有几篇关于MingW+QT的开发环境设置中提到要去掉-mthreads参数来达到不依赖mingwm10.dll文件,开始我没太在意,因为我用的不是Qt,再者我已经使用多线程,所以我觉得不能去掉-mthreads参数,但刚才我试了一下去掉了编译和连接中的-mthreads参数,居然编译过了,而且可以不依赖mingwm10.dll文件运行了?????!!!!! 难道这就是解决方案?!
进一步的测试结果是,我可以在编译的参数中加入-mthreads参数,但不能在连接的参数中加入-mthreads参数,否则编译的目标文件在运行时就要求mingwm10.dll文件。

有兴趣的可帮我试一下。另外,要感谢大家的帮助!此问题,还可继续讨论。如果有什么新的进展,我还会续贴的。


再次感谢大家的讨论,希望共同提高。
*** china ***
Utensil
Moderator
Moderator
Posts: 423
Joined: Sun Feb 03, 2008 11:38 am
Location: China

Post by Utensil »

\:D/

原来是这样,虽然不明白为什么~学习了~

P.S.可是我的CB编译的静态exe需要dll.....5555....

-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/
spritez
Earned a small fee
Earned a small fee
Posts: 21
Joined: Sat Apr 19, 2008 2:16 pm
Location: china

Post by spritez »

Utensil wrote:\:D/

原来是这样,虽然不明白为什么~学习了~

P.S.可是我的CB编译的静态exe需要dll.....5555....

-Utensil
会不会是CB的版本问题呢?我昨天换成最新的"The 19 May 2008 build (5074)"版了。
*** china ***
spritez
Earned a small fee
Earned a small fee
Posts: 21
Joined: Sat Apr 19, 2008 2:16 pm
Location: china

Post by spritez »

:D 为了说明问题,我将标准的例子threads放到cb工程里,编译成功不需要dll文件的。斑竹可试一下。
Attachments
thread_test_bc.part2.rar
(202.45 KiB) Downloaded 282 times
thread_test_bc.part1.rar
(512 KiB) Downloaded 277 times
Utensil
Moderator
Moderator
Posts: 423
Joined: Sun Feb 03, 2008 11:38 am
Location: China

Post by Utensil »

我测试了你的程序,发现的确是不需要mingwm10.dll文件的。我又用C::B编了自己的程序,发现也不需要dll……

因为我发现需要是大约半年前的事情了,后来我就几乎没用静态版本了,那时用的那时的SVN版本,可能的确是版本问题。呵呵~我一直都紧跟最新的C::B的~

现在由于我的程序经常要在2.8.7和trunk间都作测试,而且要测试Bakefile生成的Makefile没问题,所以很少用C::B来编译了,主要用它编辑和调试。

-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/
Post Reply