【问题标题】:Numerous LD linking errors while linking against downloaded package链接下载包时出现大量 LD 链接错误
【发布时间】:2020-08-09 11:41:32
【问题描述】:

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

  • 活泼
  • zlib
  • OpenSSL (>=1.0.2)
  • 卷曲
  • 重症监护室
  • brpc
  • 草稿

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

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

在链接阶段,我遇到很多错误,例如

/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 似乎在最后链接:

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

【问题讨论】:

  • 你安装库的开发包吗?
  • 请显示您的链接命令。
  • @n.'pronouns'm。我本身没有链接命令。 CMakeLists.txtFIND_PACKAGE(CURL REQUIRED)include_directories(${CURL_INCLUDE_DIR}) 行,但有一个部分是link_directories(...),没有提到curl,最后是target_link_libraries(typesense-server ${CORE_LIBS}),其中CORE_LIBS 不包含以下内容(见问题编辑):
  • @FarhadSarvari 我有来自apt-getlibcurl4-openssl-dev is already the newest version (7.64.0-4+deb10u1) 报告,但不确定如何跟踪curl 的所有依赖项,以及我是否必须安装他们的dev 版本

标签: c++ build linker-errors ld


【解决方案1】:

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

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

ldd /path/to/your/libcurl.so

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

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

解决此问题的一种方法是使用动态链接。这样,您只需链接到直接依赖项,他们知道他们的依赖项。

【讨论】:

  • 我会将答案标记为已接受,因为它让我找到了更接近解决方案的方法。问题出在FIND_PACKAGE(CURL REQUIRED),它试图获取一些错误的库版本。不得不使用this question通过添加SET(CURL_LIBRARY "-lcurl")来解决它
猜你喜欢
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多