libssh 未定义引用错误

libssh 未定义引用错误

我正在尝试建立ssh 连接示例并获取未定义的引用:

/tmp/ccb7VC9w.o: In function `verify_knownhost':
sshtest.c:(.text+0x3a): undefined reference to `ssh_get_server_publickey'
sshtest.c:(.text+0x91): undefined reference to `ssh_session_is_known_server'
collect2: error: ld returned 1 exit status

我查看了包含文件:

/usr/include/libssh/libssh.h

并发现:

LIBSSH_API int ssh_get_server_publickey(ssh_session session, ssh_key *key);
LIBSSH_API enum ssh_known_hosts_e ssh_session_is_known_server(ssh_session session)

我尝试了两种方法但均未成功:

gcc -Wall -DLIBSSH_STATIC sshtest.c  -o sshtest  -lssh
gcc -Wall sshtest.c  -o sshtest  -lssh

所以我的问题是......我是否链接不正确或者我遗漏了一些步骤?

如果需要最小可行代码,请告诉我。谢谢!

我放置了整个示例代码,而不仅仅是一点……问题出在从主函数调用的函数中。:)

#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>


#define LIBSSH_STATIC 1


int verify_knownhost(ssh_session session)
{
    enum ssh_known_hosts_e state;
    unsigned char *hash = NULL;
    ssh_key srv_pubkey = NULL;
    size_t hlen;
    char buf[10];
    char *hexa;
    char *p;
    int cmp;
    int rc;
    rc = ssh_get_server_publickey(session, &srv_pubkey);
    if (rc < 0) {
        return -1;
    }
    rc = ssh_get_publickey_hash(srv_pubkey,
                                SSH_PUBLICKEY_HASH_SHA1,
                                &hash,
                                &hlen);
    ssh_key_free(srv_pubkey);
    if (rc < 0) {
        return -1;
    }
    state = ssh_session_is_known_server(session);
    switch (state) {
        case SSH_KNOWN_HOSTS_OK:
            /* OK */
            break;
        case SSH_KNOWN_HOSTS_CHANGED:
            fprintf(stderr, "Host key for server changed: it is now:\n");
            //ssh_print_hexa("Public key hash", hash, hlen);
            fprintf(stderr, "For security reasons, connection will be stopped\n");
            ssh_clean_pubkey_hash(&hash);
            return -1;
        case SSH_KNOWN_HOSTS_OTHER:
            fprintf(stderr, "The host key for this server was not found but an other"
                    "type of key exists.\n");
            fprintf(stderr, "An attacker might change the default server key to"
                    "confuse your client into thinking the key does not exist\n");
            ssh_clean_pubkey_hash(&hash);
            return -1;
        case SSH_KNOWN_HOSTS_NOT_FOUND:
            fprintf(stderr, "Could not find known host file.\n");
            fprintf(stderr, "If you accept the host key here, the file will be"
                    "automatically created.\n");
            /* FALL THROUGH to SSH_SERVER_NOT_KNOWN behavior */
        case SSH_KNOWN_HOSTS_UNKNOWN:
            hexa = ssh_get_hexa(hash, hlen);
            fprintf(stderr,"The server is unknown. Do you trust the host key?\n");
            fprintf(stderr, "Public key hash: %s\n", hexa);
            ssh_string_free_char(hexa);
            ssh_clean_pubkey_hash(&hash);
            p = fgets(buf, sizeof(buf), stdin);
            if (p == NULL) {
                return -1;
            }
            cmp = strncasecmp(buf, "yes", 3);
            if (cmp != 0) {
                return -1;
            }
            rc = ssh_get_status(session); //ssh_session_update_known_hosts(session);
            if (rc < 0) {
                fprintf(stderr, "Error %s\n", strerror(errno));
                return -1;
            }
            break;
        case SSH_KNOWN_HOSTS_ERROR:
            fprintf(stderr, "Error %s", ssh_get_error(session));
            ssh_clean_pubkey_hash(&hash);
            return -1;
    }
    ssh_clean_pubkey_hash(&hash);
    return 0;
}


int main()
{
  ssh_session my_ssh_session;
  int rc;
  char *password;
  // Open session and set options
  my_ssh_session = ssh_new();
  if (my_ssh_session == NULL)
    exit(-1);
  ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "localhost");
  // Connect to server
  rc = ssh_connect(my_ssh_session);
  if (rc != SSH_OK)
  {
    fprintf(stderr, "Error connecting to localhost: %s\n",
            ssh_get_error(my_ssh_session));
    ssh_free(my_ssh_session);
    exit(-1);
  }
  // Verify the server's identity
  // For the source code of verify_knownhost(), check previous example
  if (verify_knownhost(my_ssh_session) < 0)
  {
    ssh_disconnect(my_ssh_session);
    ssh_free(my_ssh_session);
    exit(-1);
  }
  // Authenticate ourselves
  password = getpass("Password: ");
  rc = ssh_userauth_password(my_ssh_session, NULL, password);
  if (rc != SSH_AUTH_SUCCESS)
  {
    fprintf(stderr, "Error authenticating with password: %s\n",
            ssh_get_error(my_ssh_session));
    ssh_disconnect(my_ssh_session);
    ssh_free(my_ssh_session);
    exit(-1);
  }


  ssh_disconnect(my_ssh_session);
  ssh_free(my_ssh_session);
}

本节包含我使用过的 cmake 命令和输出。

cmake -DUNIT_TESTING=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
-- The C compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Performing Test REQUIRED_FLAGS_WERROR
-- Performing Test REQUIRED_FLAGS_WERROR - Success
-- Performing Test WITH_STD_GNU99_FLAG
-- Performing Test WITH_STD_GNU99_FLAG - Success
-- Performing Test WITH_WPEDANTIC_FLAG
-- Performing Test WITH_WPEDANTIC_FLAG - Success
-- Performing Test WITH_WALL_FLAG
-- Performing Test WITH_WALL_FLAG - Success
-- Performing Test WITH_WSHADOW_FLAG
-- Performing Test WITH_WSHADOW_FLAG - Success
-- Performing Test WITH_WMISSING_PROTOTYPES_FLAG
-- Performing Test WITH_WMISSING_PROTOTYPES_FLAG - Success
-- Performing Test WITH_WCAST_ALIGN_FLAG
-- Performing Test WITH_WCAST_ALIGN_FLAG - Success
-- Performing Test WITH_WERROR_ADDRESS_FLAG
-- Performing Test WITH_WERROR_ADDRESS_FLAG - Success
-- Performing Test WITH_WSTRICT_PROTOTYPES_FLAG
-- Performing Test WITH_WSTRICT_PROTOTYPES_FLAG - Success
-- Performing Test WITH_WERROR_STRICT_PROTOTYPES_FLAG
-- Performing Test WITH_WERROR_STRICT_PROTOTYPES_FLAG - Success
-- Performing Test WITH_WWRITE_STRINGS_FLAG
-- Performing Test WITH_WWRITE_STRINGS_FLAG - Success
-- Performing Test WITH_WERROR_WRITE_STRINGS_FLAG
-- Performing Test WITH_WERROR_WRITE_STRINGS_FLAG - Success
-- Performing Test WITH_WERROR_IMPLICIT_FUNCTION_DECLARATION_FLAG
-- Performing Test WITH_WERROR_IMPLICIT_FUNCTION_DECLARATION_FLAG - Success
-- Performing Test WITH_WPOINTER_ARITH_FLAG
-- Performing Test WITH_WPOINTER_ARITH_FLAG - Success
-- Performing Test WITH_WERROR_POINTER_ARITH_FLAG
-- Performing Test WITH_WERROR_POINTER_ARITH_FLAG - Success
-- Performing Test WITH_WDECLARATION_AFTER_STATEMENT_FLAG
-- Performing Test WITH_WDECLARATION_AFTER_STATEMENT_FLAG - Success
-- Performing Test WITH_WERROR_DECLARATION_AFTER_STATEMENT_FLAG
-- Performing Test WITH_WERROR_DECLARATION_AFTER_STATEMENT_FLAG - Success
-- Performing Test WITH_WRETURN_TYPE_FLAG
-- Performing Test WITH_WRETURN_TYPE_FLAG - Success
-- Performing Test WITH_WERROR_RETURN_TYPE_FLAG
-- Performing Test WITH_WERROR_RETURN_TYPE_FLAG - Success
-- Performing Test WITH_WUNINITIALIZED_FLAG
-- Performing Test WITH_WUNINITIALIZED_FLAG - Success
-- Performing Test WITH_WERROR_UNINITIALIZED_FLAG
-- Performing Test WITH_WERROR_UNINITIALIZED_FLAG - Success
-- Performing Test WITH_WIMPLICIT_FALLTHROUGH_FLAG
-- Performing Test WITH_WIMPLICIT_FALLTHROUGH_FLAG - Failed
-- Performing Test WITH_WERROR_STRICT_OVERFLOW_FLAG
-- Performing Test WITH_WERROR_STRICT_OVERFLOW_FLAG - Success
-- Performing Test WITH_WSTRICT_OVERFLOW_2_FLAG
-- Performing Test WITH_WSTRICT_OVERFLOW_2_FLAG - Success
-- Performing Test WITH_WNO_FORMAT_ZERO_LENGTH_FLAG
-- Performing Test WITH_WNO_FORMAT_ZERO_LENGTH_FLAG - Success
-- Performing Test WITH_WMISSING_FIELD_INITIALIZERS_FLAG
-- Performing Test WITH_WMISSING_FIELD_INITIALIZERS_FLAG - Success
-- Performing Test REQUIRED_FLAGS_WFORMAT
-- Performing Test REQUIRED_FLAGS_WFORMAT - Success
-- Performing Test WITH_WFORMAT_SECURITY_FLAG
-- Performing Test WITH_WFORMAT_SECURITY_FLAG - Success
-- Performing Test WITH_WERROR_FORMAT_SECURITY_FLAG
-- Performing Test WITH_WERROR_FORMAT_SECURITY_FLAG - Success
-- Performing Test WITH_FNO_COMMON_FLAG
-- Performing Test WITH_FNO_COMMON_FLAG - Success
-- Performing Test WITH_STACK_PROTECTOR_STRONG
-- Performing Test WITH_STACK_PROTECTOR_STRONG - Success
-- Performing Test WITH_STACK_CLASH_PROTECTION
-- Performing Test WITH_STACK_CLASH_PROTECTION - Failed
-- Performing Test WITH_WNO_DEPRECATED_DECLARATIONS_FLAG
-- Performing Test WITH_WNO_DEPRECATED_DECLARATIONS_FLAG - Success
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.8") 
-- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libssl.so;/usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.0.2g") 
-- Found CMocka: /usr/lib/x86_64-linux-gnu/libcmocka.so  
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE  
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") 
-- Checking for module 'heimdal-gssapi'
--   No package 'heimdal-gssapi' found
-- Could NOT find GSSAPI (missing:  GSSAPI_LIBRARIES GSSAPI_INCLUDE_DIR) 
-- Could NOT find NaCl (missing:  NACL_LIBRARIES NACL_INCLUDE_DIRS) 
-- Found PythonInterp: /usr/bin/python (found version "2.7.12") 
-- Could not find `abimap` in PATH. It can be found in PyPI as `abimap` (try `pip install abimap`)
-- Could NOT find ABIMap (missing:  ABIMAP_EXECUTABLE) (Required is at least version "0.3.1")
-- Performing Test WITH_VISIBILITY_HIDDEN
-- Performing Test WITH_VISIBILITY_HIDDEN - Success
-- Looking for argp.h
-- Looking for argp.h - found
-- Looking for pty.h
-- Looking for pty.h - found
-- Looking for utmp.h
-- Looking for utmp.h - found
-- Looking for termios.h
-- Looking for termios.h - found
-- Looking for unistd.h
-- Looking for unistd.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for util.h
-- Looking for util.h - not found
-- Looking for libutil.h
-- Looking for libutil.h - not found
-- Looking for sys/time.h
-- Looking for sys/time.h - found
-- Looking for sys/utime.h
-- Looking for sys/utime.h - not found
-- Looking for sys/param.h
-- Looking for sys/param.h - found
-- Looking for arpa/inet.h
-- Looking for arpa/inet.h - found
-- Looking for byteswap.h
-- Looking for byteswap.h - found
-- Looking for glob.h
-- Looking for glob.h - found
-- Looking for valgrind/valgrind.h
-- Looking for valgrind/valgrind.h - found
-- Looking for openssl/des.h
-- Looking for openssl/des.h - found
-- Looking for openssl/aes.h
-- Looking for openssl/aes.h - found
-- Looking for openssl/ecdh.h
-- Looking for openssl/ecdh.h - found
-- Looking for openssl/ec.h
-- Looking for openssl/ec.h - found
-- Looking for openssl/ecdsa.h
-- Looking for openssl/ecdsa.h - found
-- Looking for EVP_aes_128_ctr
-- Looking for EVP_aes_128_ctr - found
-- Looking for EVP_aes_128_cbc
-- Looking for EVP_aes_128_cbc - found
-- Looking for EVP_aes_128_gcm
-- Looking for EVP_aes_128_gcm - found
-- Looking for CRYPTO_THREADID_set_callback
-- Looking for CRYPTO_THREADID_set_callback - found
-- Looking for CRYPTO_ctr128_encrypt
-- Looking for CRYPTO_ctr128_encrypt - found
-- Looking for EVP_CIPHER_CTX_new
-- Looking for EVP_CIPHER_CTX_new - found
-- Looking for EVP_KDF_CTX_new_id
-- Looking for EVP_KDF_CTX_new_id - not found
-- Looking for RAND_priv_bytes
-- Looking for RAND_priv_bytes - not found
-- Looking for OPENSSL_ia32cap_loc
-- Looking for OPENSSL_ia32cap_loc - found
-- Looking for isblank
-- Looking for isblank - found
-- Looking for strncpy
-- Looking for strncpy - found
-- Looking for strndup
-- Looking for strndup - found
-- Looking for strtoull
-- Looking for strtoull - found
-- Looking for explicit_bzero
-- Looking for explicit_bzero - not found
-- Looking for memset_s
-- Looking for memset_s - not found
-- Performing Test HAVE_GLOB_GL_FLAGS_MEMBER
-- Performing Test HAVE_GLOB_GL_FLAGS_MEMBER - Success
-- Looking for glob
-- Looking for glob - found
-- Looking for vsnprintf
-- Looking for vsnprintf - found
-- Looking for snprintf
-- Looking for snprintf - found
-- Looking for poll
-- Looking for poll - found
-- Looking for select
-- Looking for select - found
-- Looking for getaddrinfo
-- Looking for getaddrinfo - found
-- Looking for ntohll
-- Looking for ntohll - not found
-- Looking for htonll
-- Looking for htonll - not found
-- Looking for clock_gettime in rt
-- Looking for clock_gettime in rt - found
-- Looking for forkpty in util
-- Looking for forkpty in util - found
-- Looking for cfmakeraw
-- Looking for cfmakeraw - found
-- Looking for __strtoull
-- Looking for __strtoull - not found
-- Looking for cmocka_set_test_filter
-- Looking for cmocka_set_test_filter - found
-- Performing Test HAVE_GCC_THREAD_LOCAL_STORAGE
-- Performing Test HAVE_GCC_THREAD_LOCAL_STORAGE - Success
-- Performing Test HAVE_MSC_THREAD_LOCAL_STORAGE
-- Performing Test HAVE_MSC_THREAD_LOCAL_STORAGE - Failed
-- Performing Test HAVE_CONSTRUCTOR_ATTRIBUTE
-- Performing Test HAVE_CONSTRUCTOR_ATTRIBUTE - Success
-- Performing Test HAVE_DESTRUCTOR_ATTRIBUTE
-- Performing Test HAVE_DESTRUCTOR_ATTRIBUTE - Success
-- Performing Test HAVE_FALLTHROUGH_ATTRIBUTE
-- Performing Test HAVE_FALLTHROUGH_ATTRIBUTE - Failed
-- Performing Test HAVE_UNUSED_ATTRIBUTE
-- Performing Test HAVE_UNUSED_ATTRIBUTE - Success
-- Performing Test HAVE_GCC_VOLATILE_MEMORY_PROTECTION
-- Performing Test HAVE_GCC_VOLATILE_MEMORY_PROTECTION - Success
-- Performing Test HAVE_COMPILER__FUNC__
-- Performing Test HAVE_COMPILER__FUNC__ - Success
-- Performing Test HAVE_COMPILER__FUNCTION__
-- Performing Test HAVE_COMPILER__FUNCTION__ - Success
-- Performing Test HAVE_LD_VERSION_SCRIPT
-- Performing Test HAVE_LD_VERSION_SCRIPT - Success
-- Check if the system is big endian
-- Searching 16 bit integer
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of unsigned short
-- Check size of unsigned short - done
-- Using unsigned short
-- Check if the system is big endian - little endian
-- Threads_FOUND=TRUE
-- The CXX compiler identification is GNU 5.4.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- ********************************************
-- ********** libssh build options : **********
-- zlib support: ON
-- libgcrypt support: OFF
-- libmbedTLS support: OFF
-- libnacl support: OFF
-- SFTP support: ON
-- Server support : ON
-- GSSAPI support : 0
-- GEX support : ON
-- Pcap debugging support : ON
-- With static library: OFF
-- Unit testing: ON
-- Client code testing: OFF
-- Blowfish cipher support: OFF
-- Server code testing: OFF
-- Public API documentation generation
-- Benchmarks: OFF
-- Symbol versioning: ON
-- Allow ABI break: OFF
-- Release is final: 
-- Global client config: /etc/ssh/ssh_config
-- Global bind config: /etc/ssh/libssh_server_config
-- ********************************************
-- Configuring done
-- Generating done
-- Build files have been written to: /home/me/Downloads/libssh-0.9.0 (2)/build

本节包含 make 命令和输出:

 make
Scanning dependencies of target ssh_static
[  1%] Building C object src/CMakeFiles/ssh_static.dir/agent.c.o
[  1%] Building C object src/CMakeFiles/ssh_static.dir/auth.c.o
[  1%] Building C object src/CMakeFiles/ssh_static.dir/base64.c.o
[  2%] Building C object src/CMakeFiles/ssh_static.dir/bignum.c.o
[  2%] Building C object src/CMakeFiles/ssh_static.dir/buffer.c.o
[  3%] Building C object src/CMakeFiles/ssh_static.dir/callbacks.c.o
[  3%] Building C object src/CMakeFiles/ssh_static.dir/channels.c.o
[  3%] Building C object src/CMakeFiles/ssh_static.dir/client.c.o
[  4%] Building C object src/CMakeFiles/ssh_static.dir/config.c.o
[  4%] Building C object src/CMakeFiles/ssh_static.dir/connect.c.o
[  5%] Building C object src/CMakeFiles/ssh_static.dir/connector.c.o
[  5%] Building C object src/CMakeFiles/ssh_static.dir/curve25519.c.o
[  5%] Building C object src/CMakeFiles/ssh_static.dir/dh.c.o
[  6%] Building C object src/CMakeFiles/ssh_static.dir/ecdh.c.o
[  6%] Building C object src/CMakeFiles/ssh_static.dir/error.c.o
[  7%] Building C object src/CMakeFiles/ssh_static.dir/getpass.c.o
[  7%] Building C object src/CMakeFiles/ssh_static.dir/init.c.o
[  7%] Building C object src/CMakeFiles/ssh_static.dir/kdf.c.o
[  8%] Building C object src/CMakeFiles/ssh_static.dir/kex.c.o
[  8%] Building C object src/CMakeFiles/ssh_static.dir/known_hosts.c.o
[  8%] Building C object src/CMakeFiles/ssh_static.dir/knownhosts.c.o
[  9%] Building C object src/CMakeFiles/ssh_static.dir/legacy.c.o
[  9%] Building C object src/CMakeFiles/ssh_static.dir/log.c.o
[ 10%] Building C object src/CMakeFiles/ssh_static.dir/match.c.o
[ 10%] Building C object src/CMakeFiles/ssh_static.dir/messages.c.o
[ 10%] Building C object src/CMakeFiles/ssh_static.dir/misc.c.o
[ 11%] Building C object src/CMakeFiles/ssh_static.dir/options.c.o
[ 11%] Building C object src/CMakeFiles/ssh_static.dir/packet.c.o
[ 12%] Building C object src/CMakeFiles/ssh_static.dir/packet_cb.c.o
[ 12%] Building C object src/CMakeFiles/ssh_static.dir/packet_crypt.c.o
[ 12%] Building C object src/CMakeFiles/ssh_static.dir/pcap.c.o
[ 13%] Building C object src/CMakeFiles/ssh_static.dir/pki.c.o
[ 13%] Building C object src/CMakeFiles/ssh_static.dir/pki_container_openssh.c.o
[ 14%] Building C object src/CMakeFiles/ssh_static.dir/pki_ed25519.c.o
[ 14%] Building C object src/CMakeFiles/ssh_static.dir/poll.c.o
[ 14%] Building C object src/CMakeFiles/ssh_static.dir/session.c.o
[ 15%] Building C object src/CMakeFiles/ssh_static.dir/scp.c.o
[ 15%] Building C object src/CMakeFiles/ssh_static.dir/socket.c.o
[ 16%] Building C object src/CMakeFiles/ssh_static.dir/string.c.o
[ 16%] Building C object src/CMakeFiles/ssh_static.dir/threads.c.o
[ 16%] Building C object src/CMakeFiles/ssh_static.dir/wrapper.c.o
[ 17%] Building C object src/CMakeFiles/ssh_static.dir/external/bcrypt_pbkdf.c.o
[ 17%] Building C object src/CMakeFiles/ssh_static.dir/external/blowfish.c.o
[ 18%] Building C object src/CMakeFiles/ssh_static.dir/external/chacha.c.o
[ 18%] Building C object src/CMakeFiles/ssh_static.dir/external/ed25519.c.o
[ 18%] Building C object src/CMakeFiles/ssh_static.dir/external/fe25519.c.o
[ 19%] Building C object src/CMakeFiles/ssh_static.dir/external/ge25519.c.o
[ 19%] Building C object src/CMakeFiles/ssh_static.dir/external/poly1305.c.o
[ 19%] Building C object src/CMakeFiles/ssh_static.dir/external/sc25519.c.o
[ 20%] Building C object src/CMakeFiles/ssh_static.dir/chachapoly.c.o
[ 20%] Building C object src/CMakeFiles/ssh_static.dir/config_parser.c.o
[ 21%] Building C object src/CMakeFiles/ssh_static.dir/token.c.o
[ 21%] Building C object src/CMakeFiles/ssh_static.dir/threads/noop.c.o
[ 21%] Building C object src/CMakeFiles/ssh_static.dir/threads/pthread.c.o
[ 22%] Building C object src/CMakeFiles/ssh_static.dir/threads/libcrypto.c.o
[ 22%] Building C object src/CMakeFiles/ssh_static.dir/pki_crypto.c.o
[ 23%] Building C object src/CMakeFiles/ssh_static.dir/ecdh_crypto.c.o
[ 23%] Building C object src/CMakeFiles/ssh_static.dir/libcrypto.c.o
In file included from /home/me/Downloads/libssh-0.9.0 (2)/src/libcrypto.c:31:0:
/home/me/Downloads/libssh-0.9.0 (2)/include/libssh/priv.h:400:22: error: expected ‘)’ before ‘__attribute__’
 #  define __unused__ __attribute__((unused))
                      ^
In file included from /home/me/Downloads/libssh-0.9.0 (2)/src/libcrypto.c:59:0:
/usr/include/valgrind/valgrind.h:6753:56: error: expected ‘,’ or ‘;’ before ‘)’ token
    __attribute__((format(__printf__, 1, 2), __unused__));
                                                        ^
In file included from /home/me/Downloads/libssh-0.9.0 (2)/src/libcrypto.c:31:0:
/home/me/Downloads/libssh-0.9.0 (2)/include/libssh/priv.h:400:22: error: expected ‘)’ before ‘__attribute__’
 #  define __unused__ __attribute__((unused))
                      ^
In file included from /home/me/Downloads/libssh-0.9.0 (2)/src/libcrypto.c:59:0:
/usr/include/valgrind/valgrind.h:6791:56: error: expected ‘,’ or ‘;’ before ‘)’ token
    __attribute__((format(__printf__, 1, 2), __unused__));
                                                        ^
src/CMakeFiles/ssh_static.dir/build.make:1430: recipe for target 'src/CMakeFiles/ssh_static.dir/libcrypto.c.o' failed
make[2]: *** [src/CMakeFiles/ssh_static.dir/libcrypto.c.o] Error 1
CMakeFiles/Makefile2:1069: recipe for target 'src/CMakeFiles/ssh_static.dir/all' failed
make[1]: *** [src/CMakeFiles/ssh_static.dir/all] Error 2
Makefile:160: recipe for target 'all' failed
make: *** [all] Error 2

答案1

删除 openssh 和 libssh-dev 并再次尝试安装:

sudo apt-get remove --purge openssh-server  libssh-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  ncurses-term openssh-sftp-server ssh-import-id
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  libssh-dev* openssh-server*
0 upgraded, 0 newly installed, 2 to remove and 3 not upgraded.
After this operation, 1,706 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 453549 files and directories currently installed.)
Removing libssh-dev (0.6.3-4.3ubuntu0.2) ...
dpkg: warning: while removing libssh-dev, directory '/usr/include/libssh' not empty so not removed
Removing openssh-server (1:7.2p2-4ubuntu2.8) ...
Purging configuration files for openssh-server (1:7.2p2-4ubuntu2.8) ...
Processing triggers for man-db (2.7.5-1) ...

确保软件包已被删除:

sudo apt-get clean
sudo apt-get autoclean

dpkg-query --list  | grep -i ssh
ii  libjsch-java                                                0.1.53-1ubuntu1                               all          Java implementation of the SSH2 protocol
ii  libssh-4:amd64                                              0.6.3-4.3ubuntu0.2                            amd64        tiny C SSH library (OpenSSL flavor)
ii  libssh-gcrypt-4:amd64                                       0.6.3-4.3ubuntu0.2                            amd64        tiny C SSH library (gcrypt flavor)
ii  openssh-client                                              1:7.2p2-4ubuntu2.8                            amd64        secure shell (SSH) client, for secure access to remote machines
ii  openssh-sftp-server                                         1:7.2p2-4ubuntu2.8                            amd64        secure shell (SSH) sftp server module, for SFTP access from remote machines
ii  ssh-import-id                                               5.5-0ubuntu1                                  all          securely retrieve an SSH public key and install it locally
ii  sshpass                                                     1.05-1                                        amd64        Non-interactive ssh password authentication

/usr/include/libssh$ ls
libsshpp.hpp

已验证的 gcc 无法与任何悬空的 ssh 库一起编译:

gcc -Wall $(pkg-config --cflags libssh) sshtest.c -o sshtest $(pkg-config --libs libssh)
sshtest.c:1:27: fatal error: libssh/libssh.h: No such file or directory
compilation terminated.

新安装 openssh 和 libssh-dev:

sudo apt-get install openssh-server libssh-dev build-essential

现在一切正常。我猜想autoclean等可能已经删除了一些悬而未决的软件包,并且安装已正确完成apt-get

gcc -Wall  sshtest.c  -o sshtest -lssh -DLIBSSH_STATIC
./sshtest tet.txt 
tst

我想对你们所有人的帮助表示感谢。没有你们的指导,我不可能解决这个问题。:)

相关内容