【发布时间】: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.txt有FIND_PACKAGE(CURL REQUIRED)、include_directories(${CURL_INCLUDE_DIR})行,但有一个部分是link_directories(...),没有提到curl,最后是target_link_libraries(typesense-server ${CORE_LIBS}),其中CORE_LIBS不包含以下内容(见问题编辑): -
@FarhadSarvari 我有来自
apt-get的libcurl4-openssl-dev is already the newest version (7.64.0-4+deb10u1)报告,但不确定如何跟踪curl的所有依赖项,以及我是否必须安装他们的dev版本
标签: c++ build linker-errors ld