Модули с Libtool и LoadLibrary() в Windows

Я пытаюсь написать кроссплатформенную программу на С++, которая будет загружать определенные модули (общие библиотеки) во время выполнения. Для этого я использую ClassLoader из библиотек Poco C++. Я написал цепочку компиляции, используя autoconf, automake и libtool. Это не должно быть проблемой в среде Linux, но проблема возникает в Windows. Я использую MinGW и MSYS при компиляции, чтобы иметь возможность использовать мои файлы Makefile. ClassLoader использует специфичную для Windows функцию LoadLibrary() для загрузки модулей, что означает, что мне нужно скомпилировать их как библиотеки DLL.

Класс, который я компилирую в библиотеку, наследует другой класс в основном приложении. Затем, когда я пытаюсь запустить make, он много жалуется на неопределенные ссылки и отказывается создавать разделяемую библиотеку. Я думаю, это из-за искажения имени. Или это потому, что я не могу наследовать класс вне библиотеки? (Этот класс не включен в исходники библиотеки, но заголовочный файл найден)

Я не совсем уверен, сколько проблем принесет то, что я настаиваю на компиляции под MinGW + MSYS, но все же использую LoadLibrary(). Кто-нибудь с опытом этого?


person roggan87    schedule 19.08.2011    source источник
comment
Я использовал LoadLibrary с DLL, созданными с помощью MinGW/libtool, без особых проблем. Я считаю, что ваша проблема может быть связана с сочетанием C++/DLL. Может быть полезен (короткий) пример кода, показывающий проблему.   -  person rodrigo    schedule 22.08.2011
comment
Спасибо. Оказалось, что проблема была не в комбинации MinGW + LoadLibrary, а в том, как она была связана. Я поместил все общие классы в одну общую библиотеку и связал ее как с исполняемым файлом, так и с модулями.   -  person roggan87    schedule 24.08.2011


Ответы (1)


В Windows при создании библиотеки DLL должны быть разрешены все ее символы. В Unix-системах вы можете оставлять вопросы нерешенными до момента загрузки, и это поведение в настоящее время включено в ваш дизайн.

Чтобы изменить это, вам, вероятно, придется выделить базовый класс в основном приложении (и все остальное, от чего зависит DLL) в собственную DLL. Таким образом, когда вы связываете свою библиотеку с подклассами, она может ссылаться на новую DLL и полностью разрешать ее символы. Загвоздка в том, что вы должны иметь возможность построить эту новую DLL со всеми разрешенными символами.

person Robert Boehne    schedule 20.04.2012