静态构建 zlib 的未解析外部符号

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

我正在使用 VS2022。我正在我的 C++ 项目中创建一个小型静态库来处理嵌入式资源(所以我们称之为

er
)。

这个库使用

zlib
(最新版本,1.3.1)在处理文件之前压缩文件(细节在这里并不重要)。所以我构建了 zlib 并将我的
er
项目与
zlibstaticd.lib
zlibstatic.lib
链接起来。

cmake 文件类似于:

set (EXPORT_HEADER_FILES
    export/er/er.hpp
)
set (SOURCE_FILES
    cpp/er.cpp
)

source_group("er/cpp" FILES ${SOURCE_FILES})
source_group("er/export" FILES ${EXPORT_HEADER_FILES})

add_library(er STATIC ${EXPORT_HEADER_FILES} ${SOURCE_FILES})

set(ZLIB_LIBS 
    debug ${ZLIB_LIBRARY}/zlibstaticd.lib optimized ${ZLIB_LIBRARY}/zlibstatic.lib
)

target_link_libraries(er PRIVATE ${ZLIB_LIBS})

target_include_directories(er
    PRIVATE hpp ${ZLIB_INCLUDE_DIRS}
    PUBLIC export
)

到目前为止一切都很好。

现在,重点是我希望

er
是独立的,这就是为什么
zlib
私人链接的。
zlib
文件中没有提及
er.hpp

所以现在我构建了

er
,并想在我的其他项目中使用它(
lib2
我们称之为它)。

因此,我添加

er
并将其作为静态库链接到我的项目(就像我对
er
的 zlib 所做的那样)。但是当我尝试编译时,我现在收到链接器错误,如下所示:

Error   LNK2019 unresolved external symbol inflate referenced in function "bool __cdecl er::decompress(...)
Error   LNK2019 unresolved external symbol deflate referenced in function "bool __cdecl er::compress(...)
Error   LNK2019 unresolved external symbol deflateEnd referenced in function "bool __cdecl er::compress(...)
Error   LNK2019 unresolved external symbol inflateEnd referenced in function "bool __cdecl er::decompress(...)
Error   LNK2019 unresolved external symbol deflateInit_ referenced in function "bool __cdecl er::compress(...)
Error   LNK2019 unresolved external symbol inflateInit_ referenced in function "bool __cdecl er::decompress(...)

现在我为什么会得到这个?

inflate
deflate
deflateEnd
inflateEnd
,...这些是
zlib
功能,因为我不想将
zlib
链接到
lib2

我真的迷路了。我试过了

#define ZLIB_WINAPI
#include <zlib/zlib.h>

er.cpp
文件中,有些可以在我在SO上找到的一些答案中提到,但它没有做任何事情。

c++ visual-studio linker zlib
1个回答
0
投票

这就是 zlib 是私有链接的原因。

正如一些程序员评论的那样,存档库在任何意义上都没有链接。

您可以将它们视为装满目标文件的购物袋。您想要准备一个加酸奶油的烤土豆;你的一个购物袋里有土豆 (

er.lib
),另一个购物袋里有酸奶油 (
zlib.lib
)。准备饭菜时,您需要使用两个袋(在链接时),即将您的最终程序与
er.lib
zlib.lib
链接。

可以将所有原料放入一个购物袋中,然后您在链接时只需要那个购物袋(组合后的

erz.lib
)。

为此,您可以解压

er.lib
zlib.lib
以从中提取所有
.obj
文件,并将这些目标文件添加到组合的
erz.lib
库中。

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