我正在尝试使用 Visual Studio 中的静态库设置多项目解决方案。
例如,项目 OtherProject 包含位于 Foo.h 中的 Foo 类,我想在项目中使用它的 MyProject的即可。
根据我的理解,要使用静态库完成此操作,我必须:
......一切都应该是桃子的。但是,如果我跳过上面的所有内容并且只包含 OtherProject 的源文件,请执行以下操作:
......一切似乎都像以前一样有效,工作少得多。
我在 MyProject 中的测试文件如下所示:
#include <OtherProject/Foo.h>
int main()
{
Foo foo;
return 0;
}
问题
(编辑)以下问题是关于类似的问题:Link libraries with dependencies in Visual C++ without getting LNK4006。 看来Visual Studio很聪明,可以处理我列出的一些步骤,避免不必要的步骤似乎摆脱了“忽略了LNK4006第二个定义”我还有进一步的说法:
答案 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
的一部分构建。
因此,如果您真的想要创建一个静态库来隐藏实现,那么您必须执行“额外”步骤。没有捷径。