【问题标题】:How do I properly link libssh?如何正确链接 libssh?
【发布时间】:2016-09-17 02:45:28
【问题描述】:

我正在尝试在我的代码 (libssh) 中包含一个库,但没有任何效果... 在这一点上,我不确定该怎么做,因为搜索引擎中没有针对我收到的错误弹出任何结果。

我在这里下载了 libssh: https://github.com/substack/libssh

我安装了这些:

yum install cmake zlib-devel libpng-devel openssl-devel -y;

创建了一个“build”目录作为 libssh 的父目录,移到那里,输入以下内容:

cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
make


[root@ build]# cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug LD_DEBUG=all ..
-- Could NOT find NaCl (missing:  NACL_LIBRARIES NACL_INCLUDE_DIRS)
-- ********************************************
-- ********** libssh build options : **********
-- zlib support: ON
-- libgcrypt support: OFF
-- libnacl support: OFF
-- SSH-1 support: OFF
-- SFTP support: ON
-- Server support : ON
-- GSSAPI support : ON
-- Pcap debugging support : ON
-- With static library: OFF
-- Unit testing: OFF
-- Client code Unit testing: OFF
-- Public API documentation generation
-- Benchmarks: OFF
-- ********************************************
-- Configuring done
-- Generating done
-- Build files have been written to: /root/libssh/build

然后它失败了......

Scanning dependencies of target exec
[  2%] Building C object examples/CMakeFiles/exec.dir/exec.c.o
[  5%] Building C object examples/CMakeFiles/exec.dir/authentication.c.o
[  8%] Building C object examples/CMakeFiles/exec.dir/knownhosts.c.o
[ 11%] Building C object examples/CMakeFiles/exec.dir/connect_ssh.c.o
Linking C executable exec
/usr/bin/ld: cannot find -lssh_shared
collect2: ld a retourné 1 code d'état d'exécution
make[2]: *** [examples/exec] Erreur 1
make[1]: *** [examples/CMakeFiles/exec.dir/all] Erreur 2
make: *** [all] Erreur 2

有人知道问题出在哪里吗? “找不到 -lssh_shared”在谷歌上没有显示任何相关内容。

【问题讨论】:

    标签: c linux gcc cmake


    【解决方案1】:

    错误消息是由于链接器/usr/bin/ld 在编译时未能链接到库ssh_shared.so

    我检查了文件libssh/build/src/CMakeFiles/ssh_shared.dir/build.make,里面有一些链接消息:

    ssh_shared_EXTERNAL_OBJECTS =
    src/libssh.so.4.2.0: /usr/lib/x86_64-linux-gnu/libz.so
    src/libssh.so.4.2.0: /usr/lib/x86_64-linux-gnu/libssl.so
    src/libssh.so.4.2.0: /usr/lib/x86_64-linux-gnu/libcrypto.so
    
    ... (snippet here) ...
    src/libssh.so.4.2.0: src/CMakeFiles/ssh_shared.dir/bind.c.o
    src/libssh.so.4.2.0: /usr/lib/x86_64-linux-gnu/libz.so
    src/libssh.so.4.2.0: /usr/lib/x86_64-linux-gnu/libssl.so
    src/libssh.so.4.2.0: /usr/lib/x86_64-linux-gnu/libcrypto.so
    src/libssh.so.4.2.0: src/CMakeFiles/ssh_shared.dir/build.make
    src/libssh.so.4.2.0: src/CMakeFiles/ssh_shared.dir/link.txt
    
    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C shared library libssh.so"
    

    您可以注意到,在构建过程中,cmake 会尝试链接我的系统路径/usr/lib/x86_64-linux-gnu/ 下的一些库。然后去检查你的。

    【讨论】:

    • 我有点不确定你是怎么做到的?我认为它需要通过cmake来完成?我在系统上根本看不到任何 ssh_shared.so。
    • 您在执行make时是否遇到过失败?你能告诉我在makefile中构建“connect_ssh.c.o”的相关命令吗?
    • 是的,它正在使用 make,现在它抛出了所有这些错误,不确定我改变了什么......失去希望,链接库显然是非常先进的东西大声笑是否有另一种方法可以在没有 cmake 的情况下做到这一点?我一步一步地按照指南进行操作。 CMakeFiles/exec.dir/exec.c.o:在函数main': /root/libssh/examples/exec.c:16: undefined reference to ssh_finalize'
    • 在编译成功之前,你肯定需要链接每个需要的库。链接器ld 将尝试链接其搜索路径下的特定库。对于您现在的问题,ssh_finalize 也定义在libssh.so 中,因此您还需要修复链接问题。 :(
    • 我尝试构建libssh,这里没有问题。我在回答中做了一些修改,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 2012-11-14
    • 1970-01-01
    • 2018-08-02
    • 2016-01-17
    • 2011-12-19
    • 2018-04-17
    • 2016-03-13
    相关资源
    最近更新 更多