В настоящее время я пишу на cpp-DLL. Afaik Я должен поместить функции в класс и пространство имен, если другая cpp-программа хочет их использовать. Но я тоже хочу использовать DLL с Labview. Labview распознает только функции, если они свободны, например. ни в пространстве имен, ни в классе. Как я могу реализовать это в своей DLL? На данный момент я установил # define-variable. Если эта переменная установлена, функции заключаются в пространство имен и класс, если нет, то они бесплатны, но я должен скомпилировать все это дважды, и я получаю два отдельных файла DLL. Итак, что я могу сделать, если мне нужен только один DLL-файл для обоих приложений? (Пожалуйста, не говорите мне, чтобы написать функции дважды, административные расходы еще хуже, я пробовал это раньше). Или мне просто нужно вызвать DLL через LoadLibrary(), если не использовать пространства имен?
Большое спасибо!Создание dll без пространства имен для cpp
ответ
Afaik Я должен поместить функции в класс и пространство имен, если другая cpp-программа хочет их использовать.
Это просто неправильно. Вам не нужно это делать вообще. Напротив, DLL были первоначально представлены как библиотеки функций C. C++ использует искаженные имена для представления пространства имен/классов и типов параметров. На этом нет никакого стандарта. Различные компиляторы используют свою собственную схему.
Резюмируя:
- Если вы экспортируете простую функцию C из библиотеки DLL, это всегда будет работать.
- Если вы экспортируете классы или что-то из пространства имен, это будет , безусловно, работать, если другой .exe/.dll скомпилирован с той же версией компилятора . Если нет - это зависит.
Что касается LoadLibrary
: она должна быть использована, если вы не знаете имя DLL или имя функции в этой DLL вперед или, если вы не хотите, чтобы загрузить этот DLL в начале вашего процесса , В противном случае (простой случай) свяжите исполняемый файл с имбибом для этой DLL. Это отлично работает для простых c-функций. LoadLibrary
следует использовать, когда по какой-то причине прямая связь плохо.
Экспорт классов C++ из DLL очень шаткий. В общем, единственный раз, когда вам гарантировано, что он будет работать, это время, когда вам это действительно не нужно (используйте статические библиотеки или просто добавляйте исходные файлы в проект). http://stackoverflow.com/questions/12314101/creating-c-dll-without-static-methods/12314276#12314276 – tenfour
Это когда вы используете LoadLibrary: 1. Вы хотите, чтобы не загружать DLL, или 2. Вы не можете гарантировать свое присутствие на пути поиска библиотеки. –
- 1. Без имени пространства имен
- 2. Создание переменной для пространства имен
- 3. Создание пространства имен для библиотеки OpenSSL?
- 4. SelectSingleNode без пространства имен
- 5. Создание пространства имен для плагинов jquery
- 6. Kubernetes - Создание определенного пространства имен для "услуг"
- 7. Создание копии полного пространства имен?
- 8. XSLT Создание пространства имен динамически
- 9. Создание dll из cpp-файлов с nmake
- 10. Как маршалировать без пространства имен?
- 11. PHP-объект для массива без пространства имен
- 12. XSLT для копирования элемента без пространства имен
- 13. Laravel 4 Пространства имен без \
- 14. Определение WSDL без пространства имен
- 15. Вызов метода без пространства имен
- 16. Как получить значения из смешанного пространства имен и пространства имен без пространства имен с помощью
- 17. Создание DLL с .DEF для определения имен функций
- 18. Функции шаблона пространства имен и скрытые переменные пространства имен
- 19. Как сгенерировать отдельный файл dll для кода определенного пространства имен
- 20. Создание XmlElement без имен
- 21. Создать элемент XML без пространства имен
- 22. Пространства имен для классов
- 23. Правильный способ определить C++ методы пространства имен в файле .cpp
- 24. XSLT | SAXON | Создание законного пространства имен расширений
- 25. vb.net создание и использование пространства имен
- 26. Неправильное создание маршрута с использованием пространства имен
- 27. Как разрешить конфликт пространства имен?
- 28. Создание DMG без дополнительного пространства
- 29. C++ Ошибка пространства имен: не является членом пространства имен
- 30. пространства имен XML для операцииContext.OutgoingMessageHeaders
Вам не нужно использовать классы или пространства имен, чтобы ваша библиотека могла использоваться для других проектов на C++. Откуда у тебя такая идея? То, что вы должны делать, это экспортировать ваши функции DLL как бесплатные функции безоговорочно, а затем предоставить отдельный класс-оболочку для компиляторов C++, если это необходимо. Вам нужно только 1 DLL (если вы не компилируете 32-битную и 64-битную). –
http://msdn.microsoft.com/de-de/library/ms235636.aspx отсюда –
@arc_lupus Это объясняет, как добавить ** класс ** в .dll. Если вам не нужен класс, не добавляйте его. И просто экспортируйте символы, используя 'extern 'C". Также прочитайте [Экспорт функций C для использования в исполняемых файлах языка C или C++] (http://msdn.microsoft.com/en-us/library/ys435b3s.aspx). – IInspectable