链接下载包时出现许多 LD 链接错误

Numerous LD linking errors while linking against downloaded package

我一直在尝试编译一个开源 C++ 项目 Typesense,它具有以下依赖项列表:

主机和目标 OS 是 Debian Linux。编译通过 cmake->make 命令序列处理。我能够通过包管理器安装一些依赖项(我相信它们位于 /usr/lib 然后),最后两个我必须自己编译,我把它们放在 /usr/local/lib.

所有依赖编译成功,目标项目编译成功

当涉及到 linking 阶段时,我遇到了很多错误,例如

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libcurl.a(libcurl_la-easy.o): in function `global_init':
(.text+0x94): undefined reference to `libssh2_init'

...

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libcurl.a(libcurl_la-http2.o): in function `on_header':
(.text+0x6c): undefined reference to `nghttp2_session_get_stream_user_data'

...

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libcurl.a(libcurl_la-socks_gssapi.o): in function `check_gss_err.part.0':
(.text+0x57): undefined reference to `gss_release_buffer'
/usr/bin/ld: (.text+0x77): undefined reference to `gss_display_status'
/usr/bin/ld: (.text+0x9b): undefined reference to `gss_release_buffer'
/usr/bin/ld: (.text+0xcf): undefined reference to `gss_release_buffer'
/usr/bin/ld: (.text+0xef): undefined reference to `gss_display_status'
/usr/bin/ld: (.text+0x112): undefined reference to `gss_release_buffer'
/usr/bin/ld: (.text+0x17e): undefined reference to `gss_release_buffer'

...

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libcurl.a(libcurl_la-curl_rtmp.o): in function `rtmp_connect':
(.text+0xd4): undefined reference to `RTMP_Connect1'

...

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libcurl.a(libcurl_la-openldap.o): in function `ldap_connecting':
(.text+0x111): undefined reference to `ldap_result'

至少有一百个这样的错误。我一点也不精通 Linux 和复杂的项目构建。我该如何修复刚刚通过包管理器下载的库的 linking 错误?

编辑:图书馆,cmake 似乎 link 最后反对:

braft;
brpc;
/usr/lib/x86_64-linux-gnu/libleveldb.a;
glog;
h2o-evloop;
iconv;
/usr/lib/x86_64-linux-gnu/libcurl.a;
for;
/usr/lib/x86_64-linux-gnu/libicui18n.a;
/usr/lib/x86_64-linux-gnu/libicuuc.a;
/usr/lib/x86_64-linux-gnu/libicudata.a;
rocksdb;
/usr/lib/x86_64-linux-gnu/libsnappy.a;
/usr/lib/x86_64-linux-gnu/libz.a;
rt;
/usr/lib/x86_64-linux-gnu/libssl.a;
/usr/lib/x86_64-linux-gnu/libcrypto.a;
pthread;
dl;
-static-libgcc;
-static-libstdc++;
gflags_shared;
/usr/lib/x86_64-linux-gnu/libprotobuf.a;
-lpthread

您的依赖项列表不完整。它只包括直接依赖。

您的 libcurl 版本是使用 ssh、gssapi、nghttp2、ldap、rtmp 和可能的其他好东西构建的,none 您link反对这些。您正在使用静态 linking,静态库没有内置的依赖概念。这意味着您必须在构建命令中手动包含所有 non-immediate 依赖项。您可以通过执行此命令来了解还需要包含多少个库

ldd /path/to/your/libcurl.so

并观察您的 libcurl 的依赖项列表。

您使用的其他库可能也是如此。

解决此问题的一种方法是使用动态 linking。这样你就可以 link 直接依赖,他们 知道 他们的 依赖。