关于C#:针对下载的程序包进行链接时出现大量LD链接错误

 2021-04-26 

Numerous LD linking errors while linking against downloaded package

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

  • 活泼的
  • zlib
  • OpenSSL(> = 1.0.2)
  • 卷曲
  • 重症监护病房
  • 英国广播公司
  • ft

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/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似乎在最后链接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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以及其他可能的功能构建的,您都无法与之抗衡。您正在使用静态链接,并且静态库没有内置的依赖项概念。这意味着您必须在build命令中手动包括所有非立即依赖性。通过执行此命令,您可以看到需要包含多少个库

ldd /path/to/your/libcurl.so

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

对于您使用的其他库,可能同样如此。

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