web-dev-qa-db-ja.com

clionとcygwinとの奇妙なC ++ライブラリリンケージの問題

WindowsでライブラリLibsshをリンクしているときにc ++プログラムをコンパイルしようとすると、次のエラーが発生します(パッケージlibssh-commonとlibssh-develの両方がcygwinとともにインストールされます)。 Clionは私にインクルードエラーを与えず、cmakeはClionのCmakeリロード中にライブラリを見つけますが、コンパイル/リンクすると、参照が未定義であると文句を言います。

誰かが私の愚かな間違いを指摘できますか?前もって感謝します!

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

私の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 ()

出力Cmakeリロード

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

- 解決 - -

私のcmakelistを次のように変更する必要がありました

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 ()
2
tibovanheule

make VEBOSE=1出力から判断すると、libsshライブラリは実際にはリンクされていません。

CMakeLists.txtで次の行を修正してみてください。

link_directories(${LIBSSH_LIBRARY_DIR})
target_link_libraries(main ${LIBSSH_LIBRARY})
  • link_directoriesのパラメーターは、LIBSSH_LIBRARY_DIRではなくLIBSSH_INCLUDE_DIRである必要があります。
  • target_link_librariesのパラメーターは、LIBSSH_LIBRARYではなくLIBSSH_LIBRARIEである必要があります。

または、代わりに:

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