C++_Out put register error & Post-Build Event do not run

在此记录一个fix bug时遇到的问题:

背景:

ProjectA用到了一个第三方的dll(AcGe18.dll). 加载该dll时出错,无法加载。原因是该dll的另一个老版本在ProjectB中已经加载过了。所以再次加载时失败。

我们代码中有两个地方要使用这个dll,但是使用的版本却不一样。这是根本的原因。

所以应该有两种方法去解决这个问题:

1. 让两个使用该dll的地方调用同一个新版本的dll,这样第二个加载的地方就不会出错。但是这样可能会导致原来调用老版本dll的地方出错。可能有一些接口变化之类的问题。

2. 将调用老版本的dll的地方强制改名,即将AcGe18.dll改为acgelw.dll。这样老版本加载起来的dll为acgelw, 而新版本加载起来时叫acge18,这样程序不认为它们是同一个dll,就不会出现问题了。

所以在这里采用了第二种方式:

  • 在projectB中, Pre-Link Event中添加命令来拷贝老版本的AcGe18.dll到对应目录下并改名字为acgelw.dll
  • 在projectB中, Post-Build Event中添加命令来改变projectB dll中所依赖的dll的名字, 即改为依赖于acgelw.dll.

但是采用第二种方式时,编译projectB时出现了output register error(code 3)的错误.使用Dependence tool来查看dll依赖关系,发现projectB build出来的dll仍然是依赖于AcGe18.dll,而不是acgelw.dll. 其实是因为写在Post-Build Event中的命令并没有被执行。

原因:

Post-Build Event中的命令为什么没有执行呢?

在ProjectB properties对话框中可以看到Configuration Properties->Linker->General->Register Output值为true。这种情况下,会先注册projectB生成的dll,然后再执行Post-Build Event。但是在注册dll时因为没有执行Post-Build Event里的命令,所以它还是会去找acge18.dll。但是acge18.dll并不存在于对应目录之下(因为在执行Pre-Link Event中的命令时只拷贝了一个叫acgelw.dll到对应目录)。

解决方案:

将ProjectB properties对话框中的Configuration Properties->Linker->General->Register Output值设置为false。然后在Post-Build Event中修改依赖dll名字的命令之后再手动去注册这个dll。

手动注册dll代码为: regsvr32 /s “$(TargetPath)”

原文链接: https://www.cnblogs.com/JaneTang/archive/2011/01/31/1948250.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++_Out put register error & Post-Build Event do not run

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/20662

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午10:43
下一篇 2023年2月7日 下午10:48

相关推荐