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.