1

Тема: Питання по С/С++ і Linux

Чи існує можливість підключення до проекту бібліотеки *.so якщо не має заголовного файлу до цієї бібліотеки? Маю динамічну бібліотеку .so з потрібним функціоналом, початкового коду як і заголовного файлу .h не маю.

P.S. Вибачайте якщо не в тому розділі пишу, розділа про сі і лінукс не знайшов.

2

Re: Питання по С/С++ і Linux

Підключити ви її то підключите але що далі робити збираєтесь?

Подякували: 0xDADA11C7, ostap34PHP2

3

Re: Питання по С/С++ і Linux

Гарне питання. Маю інформацію по назвам функцій які вона має. Також вдалося переглянути її функціонал за допомогою objdump, nm та ін. Але як зв"язати її зі головною функцією не маю поняття... Може якось можливо написати заголовний файл до неї?..

4

Re: Питання по С/С++ і Linux

Ви нам скажете що це за бібліотека?

5

Re: Питання по С/С++ і Linux

Тоді ще дизасемблюйте і почитайте (повгадуйте) які там параметри, а потім dlopen()/dlsym()

Подякували: 0xDADA11C71

6

Re: Питання по С/С++ і Linux

Якщо це Вам допоможе (чи мені :) ) libhcnetsdk.so

7 Востаннє редагувалося LoganRoss (11.07.2017 00:15:01)

Re: Питання по С/С++ і Linux

Якщо *.so файл в системній директорії:

gcc -o myProgramName myProgramName.o -ldllName

Якщо ні:

gcc -o myProgramName myProgramName.o -L/path/to/my/library/folder -ldllName

Якщо виникає runtime помилка і не знаходить бібліотеку, то:

LD_LIBRARY_PATH=path/to/my/library/folder -ldllName

Статичне підключення:

...
#include "dllName.h"
int main()
{
   ...
   // some code
   ...
}

// далі, як згадано вище - gcc ... -ldllName

Динамічне (приклад з інтернету):

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(int argc, char **argv)
{
    void *handle;
    double (*cosine)(double);
    char *error;
    handle = dlopen ("libm.so", RTLD_LAZY);
    if (!handle) 
    {
        fprintf (stderr, "%s\n", dlerror());
        exit(1);
    }
    dlerror();    /* Clear any existing error */
    cosine = dlsym(handle, "cos");
    if ((error = dlerror()) != NULL)  
    {
        fprintf (stderr, "%s\n", error);
        exit(1);
    }
    printf ("%f\n", (*cosine)(2.0));
    dlclose(handle);
    return 0;
}
Подякували: koala, 0xDADA11C72

8 Востаннє редагувалося Kizyak (11.07.2017 00:06:28)

Re: Питання по С/С++ і Linux

Дизасемблюйте .so
Якщо це Linux, то скоріш за все бібліотека має бути вільною, значить десь існує .h для неї.

9

Re: Питання по С/С++ і Linux

ще дуже важливо що б "дебажна інформація була" бібліотеки

10

Re: Питання по С/С++ і Linux

voldim написав:

Якщо це Вам допоможе (чи мені :) ) libhcnetsdk.so

Не воно ? https://github.com/superhacker777/hikka … HCNetSDK.h

11 Востаннє редагувалося voldim (11.07.2017 22:08:47)

Re: Питання по С/С++ і Linux

0x9111A написав:
voldim написав:

Якщо це Вам допоможе (чи мені :) ) libhcnetsdk.so

Не воно ? https://github.com/superhacker777/hikka … HCNetSDK.h

Цей заголовний файл я пробував втулити, багато помилок...

                                                                                ^
yoba_parser.cpp:46:23: error: ‘NET_DVR_Init’ was not declared in this scope
     if( !NET_DVR_Init() )
                       ^
yoba_parser.cpp:51:28: error: ‘NET_DVR_SetConnectTime’ was not declared in this scope
     NET_DVR_SetConnectTime();
                            ^
yoba_parser.cpp:52:26: error: ‘NET_DVR_SetReconnect’ was not declared in this scope
     NET_DVR_SetReconnect();
                          ^
yoba_parser.cpp:54:5: error: ‘NET_DVR_DEVICEINFO’ was not declared in this scope
     NET_DVR_DEVICEINFO device_info;
     ^
yoba_parser.cpp:54:24: error: expected ‘;’ before ‘device_info’
     NET_DVR_DEVICEINFO device_info;
                        ^
yoba_parser.cpp:56:9: error: expected ‘;’ before ‘ip’
  file_t ip( fopen( ip_file.val, "r" ), &fclose );
         ^
yoba_parser.cpp:59:43: error: ‘ip’ was not declared in this scope
     while( fgets( buffer, sizeof(buffer), ip.get() ) )
                                           ^
yoba_parser.cpp:62:83: error: ‘device_info’ was not declared in this scope
   UserID = NET_DVR_Login( buffer, atoi( port_num.val ), login.val, password.val, &device_info );
                                                                                   ^
yoba_parser.cpp:62:95: error: ‘NET_DVR_Login’ was not declared in this scope
   UserID = NET_DVR_Login( buffer, atoi( port_num.val ), login.val, password.val, &device_info );
                                                                                               ^
yoba_parser.cpp:69:27: error: ‘NET_DVR_Logout’ was not declared in this scope
    NET_DVR_Logout( UserID );
                           ^
yoba_parser.cpp:72:2: error: ‘ip’ was not declared in this scope
  ip.reset();
  ^
yoba_parser.cpp:73:21: error: ‘NET_DVR_Cleanup’ was not declared in this scope
     NET_DVR_Cleanup();
                     ^
yoba_parser.cpp: In function ‘void WriteData(const char*, ...)’:
yoba_parser.cpp:81:2: error: ‘file_t’ was not declared in this scope
  file_t outputFile( fopen( out_file.val, "a" ), &fclose );
  ^
yoba_parser.cpp:81:9: error: expected ‘;’ before ‘outputFile’
  file_t outputFile( fopen( out_file.val, "a" ), &fclose );
         ^
yoba_parser.cpp:83:7: error: ‘outputFile’ was not declared in this scope
  if( !outputFile.get() )
       ^
yoba_parser.cpp:88:28: error: ‘va_start’ was not declared in this scope
     va_start( list, format );
                            ^
yoba_parser.cpp:89:15: error: ‘outputFile’ was not declared in this scope
     vfprintf( outputFile.get(), format, list );
               ^
yoba_parser.cpp:90:18: error: ‘va_end’ was not declared in this scope
     va_end( list );

12

Re: Питання по С/С++ і Linux

Ну я навіть незнаю що вам сказати..
Де взяли цю "йобу" там і запитайте мабуть

Подякували: 0xDADA11C7, LoganRoss, ostap34PHP3

13

Re: Питання по С/С++ і Linux

Hikvision Card ?
бо блін біліотеку як хоч можна назвати, а назв схожих повно

14 Востаннє редагувалося prosergii (12.07.2017 13:00:47)

Re: Питання по С/С++ і Linux

Ви ж маєте інформація про функції які є всередині файлу, спробуйте просто підключити прототип функції яка вам потрібна.
Прототип {size_t     ft_strlen(const char *str);} є в {#include "libft/libft.h"}, але я можу закоментувати include і просто вказати прототип функції і все буде працювати так само. Приклад на фото для статичної бібліотеки, з динамічними не працював(
http://c2n.me/3M4uvJV.jpg

15

Re: Питання по С/С++ і Linux

prosergii написав:

Ви ж маєте інформація про функції які є всередині файлу, спробуйте просто підключити прототип функції яка вам потрібна.
Прототип {size_t     ft_strlen(const char *str);} є в {#include "libft/libft.h"}, але я можу закоментувати include і просто вказати прототип функції і все буде працювати так само. Приклад на фото для статичної бібліотеки, з динамічними не працював(
http://c2n.me/3M4uvJV.jpg

Сублюме на Linux?! Ааа, майте совість! Користуйтесь Emacs!

16

Re: Питання по С/С++ і Linux

Kizyak написав:

Сублюме на Linux?! Ааа, майте совість! Користуйтесь Emacs!

Я зараз взагалі на Win10, куди мав доступ онлайн, там і зробив. З Emacs я не подружився, пишу в Sublime. Якщо можете дати якісь обґрунтування доцільності використання Emacs - вислухаю з цікавістю.

17

Re: Питання по С/С++ і Linux

Я взагалі за кросплатхвормний Атом

Подякували: ostap34PHP, LoganRoss2

18 Востаннє редагувалося Kizyak (12.07.2017 15:50:58)

Re: Питання по С/С++ і Linux

prosergii написав:
Kizyak написав:

Сублюме на Linux?! Ааа, майте совість! Користуйтесь Emacs!

Я зараз взагалі на Win10, куди мав доступ онлайн, там і зробив. З Emacs я не подружився, пишу в Sublime. Якщо можете дати якісь обґрунтування доцільності використання Emacs - вислухаю з цікавістю.

Чесно кажучи, я і сам не дружу з емаксом, просто якимось дивом вдалося понавстановлювати всіляких плагінів, тому розлучитись із ним не можу. А взагалі, мені подобається, як Gnu Emacs фоматує код.

19

Re: Питання по С/С++ і Linux

0xDADA11C7 написав:

Я взагалі за кросплатхвормний Атом

Теж в ньому сиджу, хоча в більшості проектів на phpstorm під linux

Подякували: 0xDADA11C7, LoganRoss2

20

Re: Питання по С/С++ і Linux

0xDADA11C7 написав:

Я взагалі за кросплатхвормний Атом

І я. Або Qt Creator, залежно від задач. На Atom ще зручно з git працювати, особливо комітити.

Подякували: 0xDADA11C71