2013-09-16 4 views
1

В настоящее время я пишу на cpp-DLL. Afaik Я должен поместить функции в класс и пространство имен, если другая cpp-программа хочет их использовать. Но я тоже хочу использовать DLL с Labview. Labview распознает только функции, если они свободны, например. ни в пространстве имен, ни в классе. Как я могу реализовать это в своей DLL? На данный момент я установил # define-variable. Если эта переменная установлена, функции заключаются в пространство имен и класс, если нет, то они бесплатны, но я должен скомпилировать все это дважды, и я получаю два отдельных файла DLL. Итак, что я могу сделать, если мне нужен только один DLL-файл для обоих приложений? (Пожалуйста, не говорите мне, чтобы написать функции дважды, административные расходы еще хуже, я пробовал это раньше). Или мне просто нужно вызвать DLL через LoadLibrary(), если не использовать пространства имен?
Большое спасибо!Создание dll без пространства имен для cpp

+1

Вам не нужно использовать классы или пространства имен, чтобы ваша библиотека могла использоваться для других проектов на C++. Откуда у тебя такая идея? То, что вы должны делать, это экспортировать ваши функции DLL как бесплатные функции безоговорочно, а затем предоставить отдельный класс-оболочку для компиляторов C++, если это необходимо. Вам нужно только 1 DLL (если вы не компилируете 32-битную и 64-битную). –

+0

http://msdn.microsoft.com/de-de/library/ms235636.aspx отсюда –

+0

@arc_lupus Это объясняет, как добавить ** класс ** в .dll. Если вам не нужен класс, не добавляйте его. И просто экспортируйте символы, используя 'extern 'C". Также прочитайте [Экспорт функций C для использования в исполняемых файлах языка C или C++] (http://msdn.microsoft.com/en-us/library/ys435b3s.aspx). – IInspectable

ответ

0

Afaik Я должен поместить функции в класс и пространство имен, если другая cpp-программа хочет их использовать.

Это просто неправильно. Вам не нужно это делать вообще. Напротив, DLL были первоначально представлены как библиотеки функций C. C++ использует искаженные имена для представления пространства имен/классов и типов параметров. На этом нет никакого стандарта. Различные компиляторы используют свою собственную схему.

Резюмируя:

  • Если вы экспортируете простую функцию C из библиотеки DLL, это всегда будет работать.
  • Если вы экспортируете классы или что-то из пространства имен, это будет , безусловно, работать, если другой .exe/.dll скомпилирован с той же версией компилятора . Если нет - это зависит.

Что касается LoadLibrary: она должна быть использована, если вы не знаете имя DLL или имя функции в этой DLL вперед или, если вы не хотите, чтобы загрузить этот DLL в начале вашего процесса , В противном случае (простой случай) свяжите исполняемый файл с имбибом для этой DLL. Это отлично работает для простых c-функций. LoadLibrary следует использовать, когда по какой-то причине прямая связь плохо.

+1

Экспорт классов C++ из DLL очень шаткий. В общем, единственный раз, когда вам гарантировано, что он будет работать, это время, когда вам это действительно не нужно (используйте статические библиотеки или просто добавляйте исходные файлы в проект). http://stackoverflow.com/questions/12314101/creating-c-dll-without-static-methods/12314276#12314276 – tenfour

+0

Это когда вы используете LoadLibrary: 1. Вы хотите, чтобы не загружать DLL, или 2. Вы не можете гарантировать свое присутствие на пути поиска библиотеки. –

Смежные вопросы