从 Visual Studio 2017 引用静态库有多简单?
How simplest to reference a static library from Visual Studio 2017?
我们的产品需要一个静态库 (.lib) 文件 linked 作为供应商 API 的一部分。
我为 API 定义了一个项目,它提供了很多功能和 类,并生成了一个 .lib 文件。
但是对于 link 的 .lib 并被客户端使用,它还需要 link 反对供应商提供的静态 .lib。
所以依赖树是:
我的应用程序 -> API 包装库 -> 静态库
我可以简单地告诉 VS 我的应用程序依赖于 API Wrapper Lib - 因此我的应用程序将 link 针对 API Wrapper Lib 生成的 .lib 文件。但是它无法link 反对供应商的静态库文件。
在我的应用程序中的 linker 设置下,我可以添加 "additional dependencies" 并命名 "Static.lib" 作为依赖项 - 然后添加 "additional directories" 并指定文件夹静态库存在。
这有效。
我可以交替使用:
#pragma comment(lib, "static.lib")
在主 header 中用于 API Wrapper Lib,它被我的应用引用。这避免了在我的应用程序中设置 "additional dependencies" 的需要。但是,除非我仍然指定 "additional directories" 来命名 "static.lib" 所在的文件夹,否则这是行不通的,即使它与 API Wrapper Lib 位于同一个文件夹中依赖。
我的问题是:是否有更简单的方法来设计 API 包装库,以便它在自身中嵌入 static.lib,或者自动告诉 linker “嘿,当人们link 针对我的 .lib,确保你也查看 "static.lib" 来解决任何丢失的符号"
或者类似的..
#pragma comment(lib, ...)
很酷 - 但除了告诉它 "you're linkage dependent on the wrapper library".
之外,我仍然必须使用对包装文件夹的特殊引用来污染 My App 项目
似乎多余且混乱 - 设置一件事总是更好 - 最好由包装器库设置,以便在那一端处理所有事情 - 客户端只需要包含并指定对一件事的依赖。
求助!
对于所有 "best" 问题,我不能确定我的解决方案是 "best" - 只是它是 "functional" 并且比任何其他解决方案都更符合我的要求其他我想到的。
基本上,我决定使用 pragma 注释来告诉链接器 "link against the following file" 并且我已经包含了它的相对路径。
这意味着我断言知道此库文件相对于需要使用它的客户端项目的位置。这可能不适合您的情况?但如果是,这确实有效。
我也可以简单地拼出这个文件的确切位置作为绝对路径。这消除了我需要标准化什么客户端项目关系将是这个包装器 API 库,"injects" 静态库,但是引入了对绝对路径的需要,这意味着这个包装器库不能移动。
无论哪种方式都有一些局限性,不太理想。
如果我有办法从编译器获取当前项目的路径,以宏的形式,那我就太好了!我可以使用当前的绝对路径来准确地满足我的需求。唉,我看不出有什么办法可以从 MS Visual Studio 那里得到它。具有完整路径的当前文件可用——但是如何在预处理器时将其截断到该字符串的路径部分呢?那不在我的技能范围内。
所以,我的解决方案意味着客户端项目只需要依赖我的 API 包装器库,并且该库的主要 header 中的这一行:
#pragma comment(lib, "..\3rd Party\Wrapper API Library\static.lib")
正如我所说,虽然不完美,但功能强大且比必须向每个客户项目添加 "additional library directories" 和 "additional dependencies" 字段有了合理的改进。
这意味着如果我有两个这样的包装器,并且希望在它们之间切换,我只需要更新我想要包含在我的客户端项目中的哪个包装器,仅此而已。
更满意!
如果有人有办法从预编译器(宏阶段)获取项目路径或文件路径 - 那么请分享。然后这可能基本上是完美的。
用户@evpo 添加了这个answer here,看起来更加优雅。
他的回答有些不妥,我在这里完整引用它:
Alternatively to Link Library Dependencies in project properties there
is another way to link libraries in Visual Studio.
Open the project of the library (X) that you want to be combined with
other libraries. Add the other libraries you want combined with X
(Right Click, Add Existing Item...). Go to their properties and make
sure Item Type is Library This will include the other libraries in X
as if you ran
lib /out:X.lib X.lib other1.lib other2.lib
我们的产品需要一个静态库 (.lib) 文件 linked 作为供应商 API 的一部分。
我为 API 定义了一个项目,它提供了很多功能和 类,并生成了一个 .lib 文件。
但是对于 link 的 .lib 并被客户端使用,它还需要 link 反对供应商提供的静态 .lib。
所以依赖树是:
我的应用程序 -> API 包装库 -> 静态库
我可以简单地告诉 VS 我的应用程序依赖于 API Wrapper Lib - 因此我的应用程序将 link 针对 API Wrapper Lib 生成的 .lib 文件。但是它无法link 反对供应商的静态库文件。
在我的应用程序中的 linker 设置下,我可以添加 "additional dependencies" 并命名 "Static.lib" 作为依赖项 - 然后添加 "additional directories" 并指定文件夹静态库存在。
这有效。
我可以交替使用:
#pragma comment(lib, "static.lib")
在主 header 中用于 API Wrapper Lib,它被我的应用引用。这避免了在我的应用程序中设置 "additional dependencies" 的需要。但是,除非我仍然指定 "additional directories" 来命名 "static.lib" 所在的文件夹,否则这是行不通的,即使它与 API Wrapper Lib 位于同一个文件夹中依赖。
我的问题是:是否有更简单的方法来设计 API 包装库,以便它在自身中嵌入 static.lib,或者自动告诉 linker “嘿,当人们link 针对我的 .lib,确保你也查看 "static.lib" 来解决任何丢失的符号"
或者类似的..
#pragma comment(lib, ...)
很酷 - 但除了告诉它 "you're linkage dependent on the wrapper library".
似乎多余且混乱 - 设置一件事总是更好 - 最好由包装器库设置,以便在那一端处理所有事情 - 客户端只需要包含并指定对一件事的依赖。
求助!
对于所有 "best" 问题,我不能确定我的解决方案是 "best" - 只是它是 "functional" 并且比任何其他解决方案都更符合我的要求其他我想到的。
基本上,我决定使用 pragma 注释来告诉链接器 "link against the following file" 并且我已经包含了它的相对路径。
这意味着我断言知道此库文件相对于需要使用它的客户端项目的位置。这可能不适合您的情况?但如果是,这确实有效。
我也可以简单地拼出这个文件的确切位置作为绝对路径。这消除了我需要标准化什么客户端项目关系将是这个包装器 API 库,"injects" 静态库,但是引入了对绝对路径的需要,这意味着这个包装器库不能移动。
无论哪种方式都有一些局限性,不太理想。
如果我有办法从编译器获取当前项目的路径,以宏的形式,那我就太好了!我可以使用当前的绝对路径来准确地满足我的需求。唉,我看不出有什么办法可以从 MS Visual Studio 那里得到它。具有完整路径的当前文件可用——但是如何在预处理器时将其截断到该字符串的路径部分呢?那不在我的技能范围内。
所以,我的解决方案意味着客户端项目只需要依赖我的 API 包装器库,并且该库的主要 header 中的这一行:
#pragma comment(lib, "..\3rd Party\Wrapper API Library\static.lib")
正如我所说,虽然不完美,但功能强大且比必须向每个客户项目添加 "additional library directories" 和 "additional dependencies" 字段有了合理的改进。
这意味着如果我有两个这样的包装器,并且希望在它们之间切换,我只需要更新我想要包含在我的客户端项目中的哪个包装器,仅此而已。
更满意!
如果有人有办法从预编译器(宏阶段)获取项目路径或文件路径 - 那么请分享。然后这可能基本上是完美的。
用户@evpo 添加了这个answer here,看起来更加优雅。
他的回答有些不妥,我在这里完整引用它:
Alternatively to Link Library Dependencies in project properties there is another way to link libraries in Visual Studio.
Open the project of the library (X) that you want to be combined with other libraries. Add the other libraries you want combined with X (Right Click, Add Existing Item...). Go to their properties and make sure Item Type is Library This will include the other libraries in X as if you ran
lib /out:X.lib X.lib other1.lib other2.lib