C ++ Visual Studio - 多项目解决方案 - “静态库”与“包含目录”

时间:2014-04-20 16:17:45

标签: c++ visual-studio static-libraries

我正在尝试使用 Visual Studio 中的静态库设置多项目解决方案。

例如,项目 OtherProject 包含位于 Foo.h 中的 Foo 类,我想在项目中使用它的 MyProject的即可。

根据我的理解,要使用静态库完成此操作,我必须:

  1. OtherProject 中将“配置类型”更改为“静态库(.lib)”。
  2. MyProject 中。
    1. 在“Common Properties - > Framwork and Referencees”中添加对 OtherProject的新参考
    2. 在“VC ++目录”中
      1. 在“包含目录”中添加 OtherProject 的头文件的路径。
      2. 在“库目录”中,将 OtherProject 的路径添加到创建的“OtherProject.lib”。
    3. 在“输入>附加依赖项”中添加“OtherProject.lib”。(编辑)此步骤似乎是不必要的,并且在2.1期间隐式进行(感谢@JBentley将其指出)。
  3. 解决方案属性 - > Common Properites - > Project Dependencies”,在下拉列表中选择 MyProject ,并将依赖项添加到 OtherProject (编辑)这是不必要的,并且在步骤2.1(也是@JBentley)中隐式地进行。
  4. ......一切都应该是桃子的。但是,如果我跳过上面的所有内容并且只包含 OtherProject 的源文件,请执行以下操作:

    1. MyProject “VC ++目录 - >包含目录”中添加 OtherProject 头文件的路径(以及可能的源文件?)。
    2. ......一切似乎都像以前一样有效,工作少得多。

      我在 MyProject 中的测试文件如下所示:

      #include <OtherProject/Foo.h>
      
      int main()
      {
          Foo foo;
          return 0;
      }
      

      问题

      • 我的“静态库”方法是否有效,或者我以后可能会遇到问题?
      • 第二种方法有效吗?它会在以后产生问题吗?我想一个缺点是我无法隐藏lib文件中的部分实现,并且必须提供源代码和头文件而不是lib和头文件。
      • 每种方法都有利弊吗?

      (编辑)以下问题是关于类似的问题:Link libraries with dependencies in Visual C++ without getting LNK4006。 看来Visual Studio很聪明,可以处理我列出的一些步骤,避免不必要的步骤似乎摆脱了“忽略了LNK4006第二个定义”我还有进一步的说法:

2 个答案:

答案 0 :(得分:2)

  

我的&#34;静态图书馆&#34;方法似乎是有效的,或者我可能遇到   以后的问题?

看起来正确。无法看到任何可能导致问题的事情(除非您开始移动目录等)。

Foo的实施缺乏源代码可能会妨碍调试,使其更难使用。当然,您始终可以提供源文件和库的调试版本,在这种情况下,此特定问题会消失。#34;。

  

第二种方法有效吗?它会在以后产生问题吗?   我想一个缺点是我无法隐藏lib文件中的部分实现,   并且必须提供源和头,而不是lib和头。

是有效的(从某种意义上说,您可以将其他项目中的其他源代码包含到您当前的项目中 - 它不再是技术上的静态库&#34;),是的(用户可能还需要将Foo.cpp文件添加到项目中 - 以及项目包含的任何其他文件。如果Foo及其部分是大量文件,则可能是主要缺点。

除了必须提供源代码外,还可以增加整个项目的编译时间(至少从头开始构建)。对于小型项目而言,这可能不是问题,但较大的项目可能需要相当长的时间来构建。

加号当然是类Foo中功能的用户可以进入源代码并在出现问题时进行调试。

Is there any pros and cons of each methods?

上面回答,我想。

答案 1 :(得分:1)

你的第二种方法并不完全有效,因为你并没有真正创建静态库。您只是将OtherProject来源放在不同的目录中,而是作为MyProject的一部分构建。

因此,如果您真的想要创建一个静态库来隐藏实现,那么您必须执行“额外”步骤。没有捷径。