Как написать указатель на функцию «указывая» на макрос, который расширяется до фактической функции? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть функция в библиотеке lib.so, которую я динамически связываю с моим приложением, используя dlopen()

lib.h

void DebugPrint( unsigned char logLevel,
                 const char     *programName,
                 const char     *format,
                 ... );

#define DBG_PRINT(logLvl, format,  ...)             \
        DebugPrint(logLvl,TL_MODULE_NAME, format, ## __VA_ARGS__) 

myapp. c

void (*DBG_PRINT_ptr)( unsigned char logLevel,
                 const char     *programName,
                 const char     *format,
                 ... );

    void *handle = NULL;
    bool ret = RESULT_SUCCESS;

    /* Open Shared Lib into the same Process */
    /* LDRA_INSPECTED 496 S */
    handle = dlopen(lib.so, RTLD_NOW);
    if (NULL == handle)
    {
        /* fail to load the library */
        LLOG_error(" dlopen Error to open handle: %s\n", dlerror());
        ret = RESULT_FAILURE;
    }
        if(RESULT_SUCCESS == ret)
    {
              DBG_PRINT_ptr = dlsym(handle, "DebugPrint");

        if( DBG_PRINT_ptr  == NULL)
        {
           LLOG_error("Failed in DBG_PRINT dlsym(): Err:%s", dlerror());
           dlclose(handle);
           ret = RESULT_FAILURE;
        }
   }
(void)DBG_PRINT_ptr  ("loglevel1","dd","printval");

но я получаю ошибку во время выполнения Failed in DBG_PRINT dlsym(): Err:Symbol not found

как правильно определить указатель функции для следующего требования.

1 Ответ

0 голосов
/ 28 апреля 2020

Нет способа указать на макрос с указателем на функцию. Указатель функции может указывать только на функции.

Однако вы можете иметь указатель на функцию, которую вызывает макрос. Например:

auto fptr = &DebugPrint;

Symbol not found

Это означает, что в библиотеке динамических c символов с таким именем нет.

Один типичный ошибка заключается в попытке загрузить функцию, которая имеет связь с языком C ++. Символ такой функции будет искажен и не будет совпадать с именем функции.

Можно объявить, что функции имеют C связь с объявлением языковой связи:

extern "C"
...