Вопрос на Экспорте/Импорте DLL и Экстерн в Windows

Существует способ сделать это серверная сторона с итератором, который не сохраняет одновременную копию всех записей:

import itertools
return render_to_response('template.html',
  {
    "flattened_entries": itertools.chain(*(blog.entries for blog in blogs)),
  })
5
задан iQ. 17 September 2009 в 19:51
поделиться

2 ответа

Во-первых, вам не нужно импортировать или экспортировать typedef. Пока они находятся в файлах заголовков, которые используют обе стороны, все в порядке. Вам действительно необходимо импортировать / экспортировать функции и определения классов.

Предположительно, вы используете одни и те же файлы заголовков как для импорта, так и для экспорта кода, так что вы могли бы сделать некоторую магию makefile, чтобы определить макрос препроцессора на каждой стороне, а затем сделать что-то вроде это:

#if defined( LIBRARY_CODE )
#define MYAPI __declspec(dllexport)
#else
#define MYAPI __declspec(dllimport)
#endif

extern MYAPI void func1();
class MYAPI MyClass {
    ...
};

Что касается функций C по сравнению с C ++, вы можете сделать следующее:

#if defined( __cplusplus__ ) // always defined by C++ compilers, never by C
#define _croutine "C"
#else
#define _croutine
#endif

extern _croutine void function_with_c_linkage();

Убедитесь, что вы импортируете этот файл заголовка из исходного файла C ++ (содержащего реализацию этой функции), иначе компилятор не узнает, как его передать Соединение C.

8
ответ дан 13 December 2019 в 22:11
поделиться
  1. typedef не требует dllimport / dllexport, это просто определение
  2. dllimport / dllexport не являются стандартными, подумайте об определении макроса для других платформ / компиляторов
  3. также позаботьтесь о используемое соглашение о вызовах (cdecl, stdcall, ...), иначе вы столкнетесь с проблемами (если вам необходимо обеспечить взаимодействие с Visual basic, используйте stdcall)
  4. заключите в extern «C», чтобы ваша библиотека могла использоваться из в программах на C ++ используйте #ifdef __cplusplus, чтобы он оставался видимым только для C ++.

Взгляните на различные библиотеки OpenSource. Там вы найдете множество примеров того, как сделать хороший заголовок библиотеки. В случае C ++ без внешнего символа "C" могут возникнуть проблемы с оформлением имени.

2
ответ дан 13 December 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: