Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Visual Studio——多项目解决方案——“静态LIB”vs“包含目录”_C++_Visual Studio_Static Libraries - Fatal编程技术网

C++ Visual Studio——多项目解决方案——“静态LIB”vs“包含目录”

C++ Visual Studio——多项目解决方案——“静态LIB”vs“包含目录”,c++,visual-studio,static-libraries,C++,Visual Studio,Static Libraries,我正在尝试使用VisualStudio中的静态库设置一个多项目解决方案 例如,项目OtherProject包含位于Foo.h中的类Foo,我想在项目MyProject中使用它 据我所知,要使用静态库实现这一点,我必须: 在OtherProject中,将配置类型更改为Static library.lib。 在我的项目中。 在公共属性->框架和引用中,向其他项目添加新引用 在VC++目录中 在Include目录中,向其他项目的头文件添加路径。 在库目录中,添加从OtherProject到已创建的Ot

我正在尝试使用VisualStudio中的静态库设置一个多项目解决方案

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

据我所知,要使用静态库实现这一点,我必须:

在OtherProject中,将配置类型更改为Static library.lib。 在我的项目中。 在公共属性->框架和引用中,向其他项目添加新引用 在VC++目录中 在Include目录中,向其他项目的头文件添加路径。 在库目录中,添加从OtherProject到已创建的OtherProject.lib的路径。 在输入>其他依赖项中添加OtherProject.lib。编辑此步骤似乎没有必要,并且由于@JBentley指出了这一点,在2.1版本中隐式地执行了此步骤。 解决方案属性->公共属性->项目依赖项,在下拉列表中选择MyProject并将依赖项添加到OtherProject。编辑这是不必要的,并且在步骤2.1中也隐式地在@JBentley中进行了编辑。 …一切都应该是桃色的。但是,如果我跳过上面的所有内容,只包括OtherProject的源文件,如下所示:

#include <OtherProject/Foo.h>

int main()
{
    Foo foo;
    return 0;
}
在MyProject VC++目录->包含目录中,向其他项目头文件和可能的源文件添加路径?。 …一切似乎都像以前一样工作,而且工作量大大减少

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

#include <OtherProject/Foo.h>

int main()
{
    Foo foo;
    return 0;
}
问题

我的静态库方法看起来有效吗,或者我以后会遇到问题吗? 第二种方法有效吗?以后会不会出现问题?我想一个缺点是我不能在lib文件中隐藏部分实现,必须同时提供源代码和头文件,而不是lib和头文件。 每种方法都有利弊吗? 编辑以下问题与类似问题有关:。
Visual Studio似乎足够聪明,可以处理我列出的一些步骤,避免不必要的步骤似乎可以消除LNK4006秒定义被忽略,这是我一直在做的:

您的第二种方法不是很有效,因为您并没有真正创建静态库。您的其他项目源位于不同的目录中,但作为MyProject的一部分构建


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

您的第二种方法并不十分有效,因为您并没有真正创建静态库。您的其他项目源位于不同的目录中,但作为MyProject的一部分构建

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

我的静态库方法看起来有效吗,或者我可能会遇到 以后有什么问题吗

看起来不错。除了开始移动目录等,看不到任何会导致问题的内容

由于缺乏Foo实现的源代码,调试可能会受到阻碍,使其更难使用。当然,您始终可以提供源文件和库的调试版本,在这种情况下,这个特定的问题就消失了

第二种方法有效吗?以后会不会出现问题? 我想一个缺点是我不能在lib文件中隐藏部分实现, 并且必须同时提供源代码和头文件,而不是lib和头文件

如果您可以将其他项目中的其他源代码包含到当前项目中,这将是有效的-从技术上讲,它不再是静态库,是的,用户可能还需要将Foo.cpp文件添加到项目中-以及项目包含的任何其他文件。如果Foo及其部件包含大量文件,这可能是一个主要缺点

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

当然,还有一个好处,即Foo类中的functionality的用户可以在出现问题时进入源代码并对其进行调试

我想上面已经回答了

我的静态库方法看起来有效吗,或者我可能会遇到 以后有什么问题吗

看起来不错。除了开始移动目录等,看不到任何会导致问题的内容

由于缺乏Foo实现的源代码,调试可能会受到阻碍,使其更难使用。当然,您始终可以提供源文件和库的调试版本,在这种情况下,这个特定的问题就消失了

第二种方法有效吗?以后会不会出现问题? 我想一个缺点是我不能在lib文件中隐藏部分实现, 并且必须提供源和hea der而不是lib和header

如果您可以将其他项目中的其他源代码包含到当前项目中,这将是有效的-从技术上讲,它不再是静态库,是的,用户可能还需要将Foo.cpp文件添加到项目中-以及项目包含的任何其他文件。如果Foo及其部件包含大量文件,这可能是一个主要缺点

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

当然,还有一个好处,即Foo类中的functionality的用户可以在出现问题时进入源代码并对其进行调试


我想我已经有一段时间没有使用VS属性表了,但我相信参考的要点是,您可以跳过步骤2.2.2和2.2.3。默认情况下,MyProject应该自动链接到所有参考项目的输出,此外,由于引用,步骤3 MyProject应自动依赖于OtherProject,因此您只需提供标题路径。显式链接到静态库是多余的。@JBentley如果它是真的,那就太好了,因为这样可以节省一些时间。但是,如果跳过2.2.2和2.2.3,我不知道项目是否正在使用lib文件。如果我跳过2.2.1,那么在我尝试编译时找不到lib,因此在使用lib文件时,它似乎是必不可少的。但是,你说得对,添加一个引用似乎会自动添加一个项目依赖关系。如果你的解决方案编译并链接,那么库的使用是正确的,你可以跳过2.2.2和2.3,我在上一篇评论中将其键入为2.2.3。请注意,我没有也不建议跳过2.2.1,因为引用不考虑头包含路径。@JBentley您写这篇文章已经有一段时间了,但您知道2.1中处理了2.3,这帮助我摆脱了链接器错误LNK4006,这是我今天忽略的第二个定义。这里有一个类似的线索:Tomek Szpakowic提出了与您相同的建议,VS至少在2005年及更新版本中非常聪明,可以将所有需要的静态库添加到链接器命令行。我已经有一段时间没有使用VS属性表了,但我相信引用的要点是,您可以跳过步骤2.2.2和2.2.3。默认情况下,MyProject应该自动链接到所有引用项目的输出,并且步骤3 MyProject应该由于引用而自动依赖于OtherProject,因此您只需要提供标题路径。显式链接到静态库是多余的。@JBentley如果它是真的,那就太好了,因为这样可以节省一些时间。但是,如果跳过2.2.2和2.2.3,我不知道项目是否正在使用lib文件。如果我跳过2.2.1,那么在我尝试编译时找不到lib,因此在使用lib文件时,它似乎是必不可少的。但是,你说得对,添加一个引用似乎会自动添加一个项目依赖关系。如果你的解决方案编译并链接,那么库的使用是正确的,你可以跳过2.2.2和2.3,我在上一篇评论中将其键入为2.2.3。请注意,我没有也不建议跳过2.2.1,因为引用不考虑头包含路径。@JBentley您写这篇文章已经有一段时间了,但您知道2.1中处理了2.3,这帮助我摆脱了链接器错误LNK4006,这是我今天忽略的第二个定义。这里有一个类似的线索:Tomek Szpakowic提出了与您相同的建议,VS至少在2005和更新版本中非常聪明,可以将所有需要的静态库添加到链接器命令行。