Visual Studio 2010没有像应该做的那样自动链接依赖项目的静态库

59
  • 使用C++控制台命令行项目创建新解决方案
  • 创建新的项目,一个C++静态库
  • 使命令行项目依赖于该库
  • 确保在Configuration => Linker => General中打开“Link Library Dependencies”(默认情况下已经打开)
  • Visual Studio仍然无法链接该库。

我该怎么办?这在Visual Studio 2008中是可以工作的。

4个回答

83

这仍然有效,但是在VS 2010中已经改变了

"使用VS2010,我们停止支持项目依赖定义隐式引用,并且我们还引入了一种在项目级别定义项目依赖项的新方法。由于项目引用和项目依赖是应用于项目的紧密概念,因此在项目文件中以一致的方式一起表示它们是有意义的。正如您将在下面的片段中看到的那样,项目引用定义和项目依赖定义之间唯一的区别在于定义输出程序集包含/排除到主项目链接命令行中的元数据。尽管我们没有删除“项目依赖性”对话框,但我们建议通过“框架和引用”对话框来定义新的项目依赖项。您需要在属性页UI中将“参考程序集输出”属性设置为false以获得项目依赖项,并将其设置为true以获得项目引用。"

只需右键单击控制台项目,选择“属性->公共属性->框架和引用->添加新引用”,然后添加静态库项目;还需要检查右侧的“链接库依赖项”为“True”。似乎适用于调试和发布构建。每天都有新的东西可以学习。 ;)


4
需要将项目添加到当前解决方案吗?那么使用静态库的意义是什么呢? - Utkarsh Sinha
5
你并不需要将静态库项目添加到解决方案中,但如果它不是解决方案的一部分,Visual Studio 就无法构建它。如果你有一个预先构建好的静态库,并且它不是解决方案的一部分,那么这整个问题就不适用于你。 - Qwertie
1
我会说:“微软确保我们每天都需要学习新东西” >:) - ivan_pozdeev
4
供未来的探洞者参考:这在VS2010之后已经发生了改变。在“解决方案资源管理器”中,右键单击项目下的“引用”节点,并添加依赖项目。如果你有一个不在解决方案中的项目,你需要通过“属性->链接器->输入”手动添加.lib文件,或使用共享项目。 - user1531971
1
值得注意的是,对于MSVC 14(2015),我们需要在项目的“添加->引用...”下查找所需的依赖项。 - YePhIcK
本页面提供了有关链接库依赖项选项的一些见解:2010年5月3日,Amit Mohindra。灵活的项目对项目引用 https://devblogs.microsoft.com/cppblog/flexible-project-to-project-references/ - buzz3791

25
他们在VS2010中更改了添加C++项目依赖关系的用户界面(UI),但奇怪的是,没有删除旧UI,也没有以任何方式表明它不再起作用。
要在VS2010中创建依赖项,您需要使用“添加新引用”(可以在项目属性中找到),可能还需要在项目的右键菜单中找到(我没有VS在这里检查)。
旧的“项目依赖关系”对话框现在基本上已经失效了。

4
此外,对话框中提到了 .Net 框架,即使是纯 C++ 项目也是如此。微软显然没有在具有多个项目的解决方案上进行基本的 UI 测试。这真的给人留下了 Visual Studio 只适用于 Hello World 大小项目的印象。 - MSalters
1
旧的用户界面过去曾经做了两件事情,现在这些已经被分开了。旧的用户界面仍然会进行编译依赖项排序,而项目属性现在处理链接。仅仅因为 A 需要在 B 之前编译并不意味着 B 应该与 A 进行链接。 - Mooing Duck
1
VS 2017仍然有问题!@#$!@#$!@#$但没有被删除。JFC. >:( - Mordachai
1
@Mordachai 这仍然是项目订单所必需的。 - Swift - Friday Pie

8
对于MSVC 14(2015版本),右击项目,然后选择“添加->引用...”,并检查所有需要的依赖项。
是的,在2010年和2015年版本之间有所改变。很有趣!
如果您想链接一个包含资源的项目-您需要直接在链接器输入依赖项列表中指定.res文件(在项目属性对话框中),因为它不被上述配置所识别。
更新:
在MSVC 2017中仍然具有相同的(新)行为。

4
告诉大家一声,这也适用于 MSVC 2017。 - Lukas Kalinski

3
我相信旧的UI(依赖项)会影响Visual Studio的构建顺序,当在IDE内部构建时,这是用于信息的。新的项目配置系统将引用嵌入到每个项目文件中,以便您可以从IDE外部构建(而在以前的版本中,您不能这样做,因为您不会得到依赖项的自动链接,因为依赖项仅在解决方案级别上完成)。
在新系统中还存在一些更复杂的项目问题;具体而言,所有结果二进制项目都需要显式引用每个依赖库才能正确构建,而以前它们可以有效地从其他依赖库继承。然而,这是同样的根本原因。

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