我正在使用 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上找到的一些答案中提到,但它没有做任何事情。
这就是 zlib 是私有链接的原因。
正如一些程序员评论的那样,存档库在任何意义上都没有链接。
您可以将它们视为装满目标文件的购物袋。您想要准备一个加酸奶油的烤土豆;你的一个购物袋里有土豆 (
er.lib
),另一个购物袋里有酸奶油 (zlib.lib
)。准备饭菜时,您需要使用两个袋(在链接时),即将您的最终程序与er.lib
和zlib.lib
链接。
您可以将所有原料放入一个购物袋中,然后您在链接时只需要那个购物袋(组合后的
erz.lib
)。
为此,您可以解压
er.lib
和 zlib.lib
以从中提取所有 .obj
文件,并将这些目标文件添加到组合的 erz.lib
库中。