Problem z modułem libssh, C11

0

Witajcie, próbuje napisać klienta ssh na windows w C i niestety już na początku jest ściana ponieważ czego bym nie użył to wszędzie linijka "#include <libssh/libssh.h>" wywołuje błąd braku libssh. Ani Clion, ani VS ani Netbeans nie mówi mi jak do cholery mam to poprawnie zrobić. Na linuksie nie mam błędu braku libssh ale nie skompiluje tam tego bo rzecz jasna nie ma tam windowsowych headerów i już sam nie wiem co mam zrobić.

No i tak na marginesie, co najlepsze do pisania samego C na win? Bo z tego co widzę wszędzie obsługa nowego c++ ale z samym C to bieda piszczy, żadnych uzupełnień, podpowiedzi, ani nawet obsługi najnowszej wersji i to już we flagowych Visual Studio taka lipa więc też nie wiem czego najlepiej używać.

Pozdrawiam!

2

A w ogóle ściągnąłeś sobie i zainstalowałeś to libssh?

0

Tak, ale ręczna instalacja nie jest już polecana i obsługiwana w tym wypadku, na chwile obecną zdaje się że vcpkg rozwiązało moje problemy z libssh.
Gdybym tego vcpkg nie znalazł to bym się męczył jeszcze x lat.

2

Czego używasz jako build menadżera?
Jak w nim definiujesz ścieżki include?

0

Używam Cmake, mam następujące linijki w CMakeLists.txt:

cmake_minimum_required(VERSION 3.13)
project(sshApp2 C)

set(CMAKE_C_STANDARD 11)

add_executable(sshClient sshClient.c)
add_executable(sshServer sshServer.c)
include_directories("C:/Users/phantom/vcpkg/packages/libssh_x86-windows/include/")

Czy to powinno wystarczyć? Bo mam ogrom błędów przy kompilacji i nie wiem czy to przez błędy w kodzie czy zła konfiguracja CMake (niby wyświetla normalnie wszystkie zaincludowane rzeczy z sshlib).

====================[ Build | sshClient | Debug ]===============================
"C:\Program Files\JetBrains\CLion 2018.3.1\bin\cmake\win\bin\cmake.exe" --build C:\Users\phantom\CLionProjects\sshApp2\cmake-build-debug --target sshClient -- -j 2
Scanning dependencies of target sshClient
[ 50%] Building C object CMakeFiles/sshClient.dir/sshClient.c.obj
[100%] Linking C executable sshClient.exe
CMakeFiles\sshClient.dir/objects.a(sshClient.c.obj): In function `main':
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:16: undefined reference to `_imp__ssh_new'
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:20: undefined reference to `_imp__ssh_options_set'
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:21: undefined reference to `_imp__ssh_options_set'
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:22: undefined reference to `_imp__ssh_options_set'
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:23: undefined reference to `_imp__ssh_connect'
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:24: undefined reference to `verify_knownhost'
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:26: undefined reference to `_imp__ssh_disconnect'
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:27: undefined reference to `_imp__ssh_free'
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:31: undefined reference to `_imp__ssh_userauth_password'
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:32: undefined reference to `_imp__ssh_disconnect'
C:/Users/phantom/CLionProjects/sshApp2/sshClient.c:33: undefined reference to `_imp__ssh_free'
collect2.exe: error: ld returned 1 exit status
CMakeFiles\sshClient.dir\build.make:85: recipe for target 'sshClient.exe' failed
CMakeFiles\Makefile2:71: recipe for target 'CMakeFiles/sshClient.dir/all' failed
mingw32-make.exe[3]: *** [sshClient.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/sshClient.dir/all] Error 2
CMakeFiles\Makefile2:83: recipe for target 'CMakeFiles/sshClient.dir/rule' failed
mingw32-make.exe[1]: *** [CMakeFiles/sshClient.dir/rule] Error 2
Makefile:117: recipe for target 'sshClient' failed
mingw32-make.exe: *** [sshClient] Error 2
0

Czy to powinno wystarczyć?

Nie dodałeś biblioteki (target_link_libraries).

0

CMakeLists.txt:

cmake_minimum_required(VERSION 3.13)
project(sshApp2 C)

set(CMAKE_C_STANDARD 11)

include_directories(C:/Users/phantom/vcpkg/packages/libssh_x86-windows/include/)
add_library(libssh C:/Users/phantom/vcpkg/packages/libssh_x86-windows/include/libssh)
find_package(libssh REQUIRED)
add_executable(sshClient sshClient.c)
add_executable(sshServer sshServer.c)
target_link_libraries(sshClient sshServer.c libssh)

Error:

"C:\Program Files\JetBrains\CLion 2018.3.1\bin\cmake\win\bin\cmake.exe" -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - MinGW Makefiles" C:\Users\phantom\CLionProjects\sshApp2
CMake Error at CMakeLists.txt:8 (find_package):
  By not providing "Findlibssh.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "libssh", but
  CMake did not find one.

  Could not find a package configuration file provided by "libssh" with any
  of the following names:

    libsshConfig.cmake
    libssh-config.cmake

  Add the installation prefix of "libssh" to CMAKE_PREFIX_PATH or set
  "libssh_DIR" to a directory containing one of the above files.  If "libssh"
  provides a separate development package or SDK, be sure it has been
  installed.


-- Configuring incomplete, errors occurred!
See also "C:/Users/phantom/CLionProjects/sshApp2/cmake-build-debug/CMakeFiles/CMakeOutput.log".

[Failed to reload]

Niszczy mi to mózg, a myślałem że JS to najgorszy język na świecie.

1

target_link_libraries(sshClient sshServer.c libssh)

Co tam robi plik sshServer.c?

add_library(libssh C:/Users/phantom/vcpkg/packages/libssh_x86-windows/include/libssh)

Wtf? Dlaczego nie include_directories?

Zrobiłbym to mniej więcej tak:

set(LIBSSH_DIR "" CACHE PATH "A libssh directory")
...

include_directories("${LIBSSH_DIR}/include/")
link_directories("${LIBSSH_DIR}/lib")
...

target_link_libraries(sshClient sshServer libssh)

Ścieżkę do biblioteki podajesz w parametrach wywołania cmake przy generowaniu projektu (opcja -D, jeśli dobrze pamiętam).

0

Poradniki z internetów Panie, pisali że "include_directories" to jedna z opcji których lepiej nie używać więc szukałem alternatywy, jestem jak widać totalnie zielony z CMake.

Tak w ogóle, skoro i tak musze w parametrach wywołania podać ścieżkę biblioteki to po co ją podaje w CMakeLists? Wiesz może gdzie powinienem podać ten parametr w CLion,albo może gdzieś w plikach roboczych CMake dla środowiska tego projektu? Bo próbowałem dodać do argumentów build projektu/debuggera ale tam nie wiem co jest co bo nie ma mowy nic o CMake.

Stopień pokręcenia tego prostego procesu jest zwyczajnie chory jak dla mnie, chyba nie dam rady tego ogarnąć.

1

Tak w ogóle, skoro i tak musze w parametrach wywołania podać ścieżkę biblioteki to po co ją podaje w CMakeLists?

No a skąd kompilator ma wiedzieć, gdzie leży biblioteka? W Linuksie sprawa jest oczywista, ale w Windowsie już nie, bo tu nie ma specjalnych katalogów dla nagłówków i bibliotek. Opcja z find_package działałaby, gdyby był gdzieś w plikach moduł wyszukujący i konfigurujący bibliotekę (Findlibssh.cmake?). Być może jest gdzieś w plikach biblioteki. Wtedy mogłoby to wyglądać tak:

find_package(libssh REQUIRED)
include_directories(${libssh_INCLUDE_DIR})

add_executable(sshClient sshClient.c)
add_executable(sshServer sshServer.c)

target_link_libraries(sshClient ${libssh_LIBRARIES})
target_link_libraries(sshServer ${libssh_LIBRARIES})

Wiesz może gdzie powinienem podać ten parametr w CLion

Nie wiem, nie znam CLiona, ale szukałbym w opcjach projektu.

0
0x666 napisał(a):

Tak w ogóle, skoro i tak musze w parametrach wywołania podać ścieżkę biblioteki to po co ją podaje w CMakeLists?

No a skąd kompilator ma wiedzieć, gdzie leży biblioteka? W Linuksie sprawa jest oczywista, ale w Windowsie już nie, bo tu nie ma specjalnych katalogów dla nagłówków i bibliotek.

Hm, no a skąd kompilator wie gdzie jest np stdio? Są przecież no zmenne path w windowsie itd, z większością języków nie traci się czasu na takie pierdoły bo instalujesz moduł globalnie albo dla samego env i wsio, tu powinno być podobnie zrobione, a nawet gdyby nie było to możliwe to powinna być jakaś cholerna standaryzacja tak jak w przypadku np .VST czy .DLL że nawet zewnętrzne programy bez modyfikowania systemu wiedzą gdzie ich szukać. Dobrze że nie trzeba temu kompilatorowi podawać lokalizacji kompilatora ale może w następnej wersji dodadzą taki feature ;)

No cóż, dziękuje za pomoc bo wyjaśniłeś mi mimo wszystko b.dużo, cięzka ta przeprawa ale może stąd sobie poradzę jakoś.

0

no a skąd kompilator wie gdzie jest np stdio?

To jest standardowa biblioteka, więc siłą rzeczy kompilator "wie", gdzie leżą biblioteki, które są częścią języka, który kompiluje. libssh jest biblioteką zewnętrzną, dlatego musisz podawać ścieżki i jawnie dodać bibliotekę do projektu.

a nawet gdyby nie było to możliwe to powinna być jakaś cholerna standaryzacja tak jak w przypadku np .VST czy .DLL że nawet zewnętrzne programy bez modyfikowania systemu wiedzą gdzie ich szukać.

W przypadku VST nie ma jakiejś standaryzacji co do lokalizacji, większość programów ma możliwość ustawienia ścieżki do katalogu z pluginami, choć wprawdzie przyjęło się, że jest to C:\Program Files\VstPlugins, ale to żaden standard.

1 użytkowników online, w tym zalogowanych: 0, gości: 1