Динамическая Общая компиляция Библиотеки с g ++

Давайте рассмотрим несколько вещей:

  1. overlay2 является драйвером хранилища по умолчанию, но, как вы можете видеть в документации драйвера хранилища докеров , действует только xfs с ftype = 1, ext4 Возможно, ваш /u01/docker находится в другой файловой системе.

  2. Если ваш /u01/docker является xfs с типом ftype = 1 или ext4, проверьте selinux отключены.

Для проверки совместимости системы поддержки с вашим оверлеем2 вы можете выполнить:

$ docker info

Containers: 0
Images: 0
Storage Driver: overlay2
 Backing Filesystem: xfs

12
задан Bill the Lizard 27 January 2009 в 15:16
поделиться

3 ответа

C разрешает неявные броски от void * к любому типу указателя (включая указатели функции); C++ требует явного кастинга. Как leiflundgren говорит, необходимо бросить возвращаемое значение dlsym() к указателю функции вводят Вас потребность.

Многие люди находят синтаксис указателя функции C неловким. Один общий шаблон является к определению типа указателем функции:

typedef double (*cosine_func_ptr)(double);

Можно определить переменную указателя функции cosine как член Вашего типа:

cosine_func_ptr cosine;

И бросок, использующий тип вместо неловкого синтаксиса указателя функции:

cosine = (cosine_func_ptr)dlsym(handle, "cos");
26
ответ дан 2 December 2019 в 04:17
поделиться

С путем Ваш код, если записано, это - действительно больше вопроса C, но можно добраться, это к будет работать в C++. У меня нет учебного руководства для Вас на Динамических Общих Библиотеках (веб-страница, с которой Вы связались, кажется прекрасным), но вот то, как исправить Ваш код в C++:

  • объявите, что my_cos функция, которая (в конечном счете) назовет динамично загруженную косинусную функцию:

    double my_cos(double);
    
  • присвойте указатель функции my_cos

    my_cos = (double (*)(double)) dlsym(handle, "cos");
    

Это немного сложно, но это присваивает my_cos что-то, что возвращает двойное, является результатом разыменования другого указателя функции и берет двойное в качестве аргумента. Поскольку другие люди отправили, C++ немного более требователен о явности Вашего кода, чем C.

  • замена, которая скорее датировала сообщение fputs со станд.:: cerr или станд.:: суд:

    std::cerr << "error loading library cos: " << error << std::endl;
    

и

std::cout << "result is " << (*my_cos)(2.0)) << std::endl;

Надеюсь что эта справка. Если бы тот странный материал casty пугает Вас, я рекомендовал бы Глубокие Секреты C липой фургона, и определенно Kernighan и Ritchie Book на C.

Править: Положительная сторона в комментарии о том, как Вы конкретно ищете руководство по разработке в C++, а не C для предотвращения этого типа проблемы. Я не знаю о сопоставимом руководстве в C++, но приблизительно 99% кода C могут быть встроены в C++, кодируют и работают просто великолепно. Этот случай указателя функции является одним из исключений.

0
ответ дан 2 December 2019 в 04:17
поделиться

dlsym возвращает указатель на символ. (Как void* быть универсальным.) В Вашем случае необходимо бросить его к указателю функции.

 double (*mycosine)(double); // declare function pointer
 mycosine = (double (*)(double)) dlsym(handle, "cos"); // cast to function pointer and assign

 double one = mycosine(0.0); // cos(0)

Так эти из этих редких случаев, где ошибка компилятора является хорошей подсказкой.;)

9
ответ дан 2 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: