gpt4 book ai didi

c++ - 为其他人生成 C++ 静态或动态库时的最佳实践?

转载 作者:行者123 更新时间:2023-11-28 02:23:38 24 4
gpt4 key购买 nike

我正在为我公司的其他客户提供 Microsoft C++ 库(静态和动态)。我的库中有一些类依赖于位于常见 Windows DLL 中的函数,这些 DLL 的导入库默认包含在项目链接设置中。

与其在每次出现这样的新依赖项时向我的库的每个构建配置的链接器部分添加一个新的导入库名称,我认为它在依赖项封装方面会更好(并且更 self -documenting) 如果我在类的 .cpp 文件中使用 #pragma comment(lib, ...) 依赖于此类 DLL 中的函数,例如:

Foo.cpp:

#include <SomeWinLib.h>

#pragma comment(lib, "somewinlib.lib")

... implementation of Foo class ...

...但我发现如果我的图书馆的客户也在使用 SomeWinLib,这会导致链接警告/错误。在对该主题进行了一些阅读之后,推荐/最佳做法似乎是让在我的库中链接的客户端也链接到它所依赖的库中。

我仍然希望这对客户来说尽可能自动/无痛,而不是仅仅将所需导入库的列表放在 readme.txt 文件中(然后坐下来等待来自沮丧的不可避免的电话开发人员),我只是将 #pragma comment 放在 Foo.h 头文件 中。这样,如果客户端包含需要它的类的头文件,它们将自动链接到所需的库中。

Foo.h:

#pragma comment(lib, "somewinlib.lib")

public class Foo
{

但是,当我构建我的库时,Foo.cpp 显然包含 Foo.h,因此我似乎需要某种预处理器“保护”围绕标题中的 #pragma comment 行文件,以便只有在客户端包含我的头文件时预处理器才能看到它。

Foo.h:

#if !defined(building_my_library)
#pragma comment(lib, "somewinlib.lib")
#endif

public class Foo
{

所有这一切似乎是几乎每个图书馆都必须做的事情,但当我用谷歌搜索其他开源 Windows 图书馆时,我没有看到这方面的例子。这让我怀疑我错过了什么地方。

有谁知道我是否正确理解了问题,如果是这样,我是否使解决方案过于复杂了?

谢谢!

最佳答案

你的最后一个选择或多或少是 boost header 所做的,除了它们还提供了一个预处理器指令来显式关闭自动链接,以防你想自己控制事情:

#if !defined(building_my_library) && !defined(no_auto_link_stuff)
#pragma comment(lib, "somelib.lib")
#endif

关于c++ - 为其他人生成 C++ 静态或动态库时的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31444860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com