Strano problema di collegamento alla libreria C ++ con clion e cygwin


2

Ho il seguente errore quando provavo a compilare un programma c ++ mentre collegavo la libreria Libssh su Windows (pacchetti libssh-common e libssh-devel entrambi installati con cygwin). Clion non mi dà un errore di inclusione e cmake trova la libreria durante la ricarica di Clion di Cmake, ma durante la compilazione / collegamento si lamenta che i riferimenti non sono definiti.

Qualcuno potrebbe sottolineare il mio stupido errore? Grazie in anticipo!

Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable main.exe
CMakeFiles/main.dir/main.cpp.o:main.cpp:(.text+0x30): undefined reference to `ssh_new'
CMakeFiles/main.dir/main.cpp.o:main.cpp:(.text+0x30): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `ssh_new'
collect2: error: ld returned 1 exit status

my CmakeLisst.txt

add_executable(main main.cpp)
find_package(LIBSSH)
IF (LIBSSH_FOUND)
    message(${LIBSSH_VERSION})
    include_directories(${LIBSSH_INCLUDE_DIR})
    link_directories(${LIBSSH_INCLUDE_DIR})
    target_link_libraries(main ${LIBSSH_LIBRARIE})
endif ()

output Cmake ricaricare

C:\Users\seven\.CLion2018.3\system\cygwin_cmake\bin\cmake.exe -DCMAKE_BUILD_TYPE= -DCMAKE_MAKE_PROGRAM=C:/cygwin64/bin/make.exe -DCMAKE_C_COMPILER=C:/cygwin64/bin/gcc.exe -DCMAKE_CXX_COMPILER=C:/cygwin64/bin/g++.exe -G "CodeBlocks - Unix Makefiles" "/cygdrive/c/Users/seven/Documents/github/Server control"
0.7.5
-- Configuring done
-- Generating done
-- Build files have been written to: /cygdrive/c/Users/seven/Documents/github/Server control/cmake-build-default-cygwin

[Finished]

main.cpp

#include <stdlib.h>
#include <iostream>
#define LIBSSH_STATIC 1
#include <libssh\libssh.h>

int main() {
    std::cout << "Hello world" << std::endl;
    ssh_session my_ssh_session = ssh_new();
    return 0;
}

--update 1-- CmakeOutput.log github gist

--SOLUZIONE----

Ho dovuto cambiare la mia cmakelist in quanto segue

find_package(LIBSSH)
IF (LIBSSH_FOUND)
    message(${LIBSSH_VERSION})
    include_directories(${LIBSSH_INCLUDE_DIR})
    link_directories(${LIBSSH_LIBRARY_DIR})
    target_link_libraries(main -L${LIBSSH_LIBRARY} -lssh)
endif ()

Sei assolutamente sicuro che la LIBSSH_FOUNDparte in CMakeLists.txtsia eseguita? Prova a ispezionare CMakeOutput.loge CMakeError.logper accertarti di possibili suggerimenti utili
valiano

1
@valiano Bene, riesce a stampare il numero di versione corretto, quindi ho pensato che il blocco fosse eseguito. Ho provato a trovare CMakeError.log ma non è presente nei file del mio progetto. Non trovo alcuna voce strana in CmakeOutput.logma non trovo nulla di libssh. Darò un github
gistub

Grazie per l'essenziale Tibo_Vanheule. È difficile per me dire se libssh è davvero scelto. Puoi verificare se è effettivamente collegato a: esegui make VERBOSE=1dalla riga di comando, dove Makefilesi trova il tuo progetto (possibilmente cambia un file sorgente per forzare la compilazione). Quindi, cercare la ldriga di comando nell'output di generazione.
valiano

Ok, quindi dopo aver corso make VERBSOE=1. Ho guardato nell'output e non ho trovato il comando ld. fare un output dettagliato. Grazie per la risposta!
tibovanheule,

Risposte:


0

A giudicare make VEBOSE=1dall'output, la libreria libssh non è effettivamente collegata.

Prova a correggere queste righe in CMakeLists.txt:

link_directories(${LIBSSH_LIBRARY_DIR})
target_link_libraries(main ${LIBSSH_LIBRARY})
  • Il parametro link_directoriesdovrebbe essere LIBSSH_LIBRARY_DIR, piuttosto che LIBSSH_INCLUDE_DIR.
  • Il parametro target_link_librariesdovrebbe essere LIBSSH_LIBRARY, piuttosto che LIBSSH_LIBRARIE.

Oppure, in alternativa:

link_directories(${LIBSSH_LIBRARY_DIR})
target_link_libraries(main -L${LIBSSH_LIBRARY_DIR} -lssh")

Grazie, corregge il collegamento, ma ha dato un nuovo errore, purtroppo! make[2]: *** No rule to make target '/usr/lib/cygssh.dll', needed by 'main.exe'. Stop. nuova sintesi dettagliata e sì, ho installato tutti i pacchetti relativi a openssh
tibovanheule

Mmm ... hai capito cygssh.dll, ma penso che tu stia davvero cercando libssh.a. E se lo usi target_link_libraries(main -L${LIBSSH_LIBRARY_DIR} -lssh")? Oppure, persino codificare il percorso libssh.a, se nient'altro funziona.
valiano

Ora si compila perfettamente, grazie mille per avermi aiutato!
tibovanheule,

@tibovanheule volentieri!
valiano
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.