Problem z modułem libssh, C11

Problem z modułem libssh, C11
Ragnar Lothbrok
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:35
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!

GS
  • Rejestracja:ponad 8 lat
  • Ostatnio:dzień
  • Postów:1265
2

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

Ragnar Lothbrok
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:35
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.

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
2

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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Ragnar Lothbrok
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:35
0

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

Kopiuj
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).

Kopiuj
====================[ 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
06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
0

Czy to powinno wystarczyć?

Nie dodałeś biblioteki (target_link_libraries).

Ragnar Lothbrok
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:35
0

CMakeLists.txt:

Kopiuj
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:

Kopiuj
"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.

06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
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:

Kopiuj
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).

edytowany 1x, ostatnio: _0x666_
Ragnar Lothbrok
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:35
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ąć.

06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
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:

Kopiuj
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.

Ragnar Lothbrok
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 4 lata
  • Postów:35
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ś.

06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)