如何使用cmake将系统库静态链接到静态库

问题描述 投票:0回答:1

我正在开发一个相当大的应用程序,需要将部分功能作为静态库提供给公司其他团队(静态库的主要原因是为了防止与潜在的不同版本的子库或不同版本的冲突)编译器版本/选项)。

我可以使用 $ 语法将子库静态链接到我的库中,如下所示:

add_library(
   MyLibrary STATIC
        ${MyLibrarySourceFiles}
        $<TARGET_OBJECTS:SubLib1>
        $<TARGET_OBJECTS:SubLib2>
)

但是我完全不知道如何包含外部库,例如

crypt32
libucrt.lib

我更愿意只提供库的发布版本,因为它使部署更容易一些(在我当前的尝试中,由于发布/调试冲突,我无法使用

MyLibrary
编译测试应用程序的调试版本在库中的 VS 运行时和应用程序之间,我希望通过链接
MyLibrary
libucrt.lib
)来解决。

c++ cmake
1个回答
0
投票

我不使用 CMAKE,但我至少可以提供一些信息。

crypt32
libucrt.lib
之间存在差异,因此您需要以不同方式处理它们。

crypt32.dll
是一个 Windows DLL - 您可以在
c:\windows\system32
中找到它 - 所以您无需担心它,您的库的使用者已经拥有它了。

libucrt.lib
是C++运行时,由编译器提供,有两个版本 - 静态和动态。 每个都有两个进一步的版本:调试和发布。

不幸的是,MSVC 要求您对库的使用者施加约束(或者也许他们将其施加给您),并且您都使用相同风格的运行时(例如静态发布)来构建。 然后一切都应该“正常工作”。

我想补充一点(如果我理解正确的话),我觉得奇怪的是,开发应用程序的团队不(也)希望您提供库的调试版本,然后他们也可以以这种方式构建他们的应用程序。 调试发布代码可能是一场噩梦。

© www.soinside.com 2019 - 2024. All rights reserved.