Давайте рассмотрим несколько вещей:
overlay2 является драйвером хранилища по умолчанию, но, как вы можете видеть в документации драйвера хранилища докеров , действует только xfs с ftype = 1, ext4 Возможно, ваш /u01/docker
находится в другой файловой системе.
Если ваш /u01/docker
является xfs с типом ftype = 1 или ext4, проверьте selinux отключены.
Для проверки совместимости системы поддержки с вашим оверлеем2 вы можете выполнить:
$ docker info
Containers: 0
Images: 0
Storage Driver: overlay2
Backing Filesystem: xfs
C разрешает неявные броски от void *
к любому типу указателя (включая указатели функции); C++ требует явного кастинга. Как leiflundgren говорит, необходимо бросить возвращаемое значение dlsym()
к указателю функции вводят Вас потребность.
Многие люди находят синтаксис указателя функции C неловким. Один общий шаблон является к определению типа указателем функции:
typedef double (*cosine_func_ptr)(double);
Можно определить переменную указателя функции cosine
как член Вашего типа:
cosine_func_ptr cosine;
И бросок, использующий тип вместо неловкого синтаксиса указателя функции:
cosine = (cosine_func_ptr)dlsym(handle, "cos");
С путем Ваш код, если записано, это - действительно больше вопроса 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++, кодируют и работают просто великолепно. Этот случай указателя функции является одним из исключений.
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)
Так эти из этих редких случаев, где ошибка компилятора является хорошей подсказкой.;)