Одна вещь, которую нужно проверить, которая, кажется, еще не упоминалась, - это то, что точное имя 'create' должно быть экспортировано из вашей общей библиотеки.
Попробуйте
nm --dynamic --defined-only RollDice.so | grep create
Если вы не нашли совпадений или получили какой-то изуродованный символ для 'create', то ваш вызов dlsym (..., "create") обязательно завершится неудачей.
Кроме того, после того, как вы решите проблемы с поиском имен, вы должны серьезно подумать о добавлении RTLD_GLOBAL к своим флагам dlopen. dlopen по умолчанию - RTLD_LOCAL, который плохо взаимодействует с общими библиотеками C ++ w.r.t. RTTI, исключения, typeinfo и т. Д. RTLD_GLOBAL приведет к меньшему количеству сюрпризов.
Также рассмотрите возможность использования RTLD_NOW, а не RTLD_LAZY. Если в вашей библиотеке плагинов есть символы, которые нельзя было разрешить во время добавления, вы только что создали бомбу замедленного действия. Лучше знать в рабочее время, была ли библиотека в состоянии удовлетворить все необходимые ссылки или нет.
редактирование:
Я упустил из виду, что проверка 'create' с 'nm' уже была предложена. Тем не менее, совет по поводу флагов dlopen по-прежнему важен.
Кроме того, ваша строка компиляции выглядит очень странно для меня, особенно в том, что вы включаете RollDice.h в строку сборки, а не файл RollDice.cpp.
Кроме того, включение файлов .cpp в другие файлы .cpp не является стандартной практикой.
Я бы предложил исключить включение .cpp в .cpp, а затем скомпилировать различные файлы .cpp отдельно с -o, а затем объединить их в общую библиотеку:
g++ -g -fPIC -c -o RollDice.o RollDice.cpp
g++ -g -fPIC -c -o IPluginFunctions.o IPluginFunctions.cpp
g++ -g -fPIC -c -o IPlugins.o IPlugins.cpp
g++ -g -fPIC -shared -o RollDice.so RollDice.o IPluginFunctions.o IPlugins.o