首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接下载包时的大量LD链接错误

链接下载包时的大量LD链接错误
EN

Stack Overflow用户
提问于 2020-08-09 11:41:32
回答 1查看 386关注 0票数 1

我一直试图编译一个开放源代码的C++项目台风,该项目包含以下依赖项:

  • 斯巴比
  • zlib
  • OpenSSL (>=1.0.2)
  • 卷曲
  • ICU
  • brpc
  • 吹牛

主机和目标操作系统是Debian。编译通过cmake->make命令序列处理。我能够通过包管理器安装一些依赖项(我相信它们驻留在/usr/lib中),最后两个依赖项必须自己编译,我将它们放在/usr/local/lib中。

所有依赖项都已成功编译,目标项目也已编译完毕。

当涉及到链接阶段时,我会遇到许多错误,比如

代码语言:javascript
复制
/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和复杂的项目构建。如何修复刚才通过包管理器下载的库的链接错误?

编辑:库,这个cmake似乎链接到了最后:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-09 12:40:32

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

您的libcurl版本是用ssh、gssapi、nghttp2、ldap、rtmp和其他可能的好东西构建的,没有一个是您要链接的。您正在使用静态链接,并且静态库没有内置的依赖关系概念。这意味着您必须在构建命令中手动包含所有非直接依赖项。通过执行以下命令,您可以得到需要包含多少更多库的印象。

ldd /path/to/your/libcurl.so

并观察libcurl的依赖项列表。

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

解决这个问题的一种方法是使用动态链接。通过这种方式,您只需链接到直接依赖项,它们就知道它们的依赖关系。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63325888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档