在VS 2010中构建两个使用相同dll的C++应用程序

3

我有两个应用程序A和B,两者都使用dll D。
A、B和D都是C++项目,使用vs 2010开发。

A.sln和B.sln是构建应用程序A和B的解决方案文件。
在A和B中都引用了dll D。

应用程序和dll的预期位置为(假设为Debug版本):
A/Debug/A.exe
A/Debug/D.dll
B/Debug/B.exe
B/Debug/D.dll

这里出现了一个奇怪的问题:当重新生成(或清理)解决方案B时,它会删除A/Debug/D.dll,尽管这两个应用程序在任何方面都没有关联。

是否有一种方法可以指示vs仅在重新生成B时删除B下的D.dll?


你的项目中是否有该dll的二进制引用? - Jay
不确定您所说的“二进制引用”是什么意思,但在A和B中都有对D的引用(即,在A.sln中,右键单击A项目,选择“引用”...添加新引用... D;B同理)。 - Benjamin Nitlehoo
在Visual Studio中,您可以向项目或直接向二进制文件添加引用。当您添加引用时,窗口中有选项卡。在引用属性中还有一个“复制本地”选项。此选项将引用的文件复制到生成目录中。当您说dll被替换时,您是否看到了在构建时发生的复制本地操作? - Jay
3个回答

2

Solution B对D的引用提示路径是什么?

如果您的提示路径指向Solution A,那就是问题所在。删除引用,将D.dll从其所在位置复制到Solution B文件夹中,然后使用该路径重新构建引用,而不是Solution A路径。


“提示路径”是一个应该检查的好主意,所以加50分。我联系不上Karkashon,所以不知道那是否解决了他的问题;但是,他的问题很好,因为MSVS经常很神秘...;-) - charley

1

你是通过复制 *.vcproj 并更改一些内容来创建项目的吗?如果是这样,那么你可能会遇到用于标识项目的 GUID 冲突问题。(这在许多开发商店中都是一个非常普遍的问题。)

Microsoft 使用 GUID 来缓存每个在该计算机上构建的项目的 Windows 注册表,以“查找”引用的项目并在硬盘上找到它。(因此,*.sln 文件不会在引用的项目在硬盘上移动时“破裂”;同样,项目可以通过这种方式引用其他项目,并且不会“破裂”,因为你可以随意移动文件。)

请记住,每个项目都有一个全局/普遍唯一的 GUID 用于标识项目(如果有冲突,就是这个),还有另一个 GUID 用于标识“项目类型”(例如 DLL、EXE、.NET 程序集等)。还有其他 GUID 用于标识项目中的“文件集”,但我还没有弄清楚它们是如何使用的(尚未)。

微软在以下链接中列出了一些项目类型的GUID:http://msdn.microsoft.com/en-us/library/hb23x61k%28v=vs.80%29.aspx

...你可以通过搜索网络来获取更完整的三十个左右的列表,例如:

http://onlinecoder.blogspot.com/2009/09/visual-studio-projects-project-type.html

“unique-to-project” GUID 是通过任何 GUID 生成器生成的,因此预计它们是真正唯一的。


所有项目和解决方案都是新创建的,并使用不同的GUID。 - Benjamin Nitlehoo

1

关于方案A怎么样?

当你重新构建它时会发生什么?它会删除DLL吗?

如果不会,检查以下内容:

  1. D项目是否是方案A的一部分(或者不是)。
  2. D项目依赖于A项目。
  3. “引用”和适当的链接器设置。

如果方案A与方案B存在不一致,您需要在方案A中应用相同的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接