Подтвердить что ты не робот

Как люди обрабатывают предупреждение C4793: "some_function": функция скомпилирована как родная?

Я использую библиотеку OpenCV и один из ее файлов заголовков cxoperations.hpp, генерирует "warning C4793: 'anonymous namespace'::CV_XADD' : function compiled as native", если мой проект на С++ скомпилирован с поддержкой CLR. Я могу предотвратить предупреждение, окружая заголовок OpenCV, следующим образом:

#pragma managed(push,off)
#include <cv.h>
#pragma managed(pop)

Но проект, который фактически использует OpenCV, не скомпилирован с поддержкой CLR, это родная статическая библиотека С++. Проект, который имеет поддержку CLR и генерирует это предупреждение без инструкций pragma, просто использует эту статическую библиотеку. Поэтому я немного удивлен тем, что предупреждение было создано вообще, особенно учитывая тот факт, что вся статическая библиотека не скомпилирована с поддержкой CLR, и все же это только один заголовок, который вызывает проблему.

Таким образом, это решение кажется мне неоптимальным. Как вы справляетесь с этим предупреждением или можете ли вы рекомендовать лучшую практику?

4b9b3361

Ответ 1

Я думаю, что вы хотите:

#pragma unmanaged
#include <cv.h>
#pragma managed
// managed code wrapping unmanaged opencv functions

Проект С++/CLI может содержать как управляемые, так и неуправляемые части, а компилятор заботится о сортировке данных между двумя для вас. Управляемые точки входа будут вызываться из обычных приложений .NET(например, С# и остальных) и будут использовать сборку мусора, и они вызовут неуправляемые функции для тяжелого подъема.

Ответ 2

Я думаю, вы должны подавить предупреждение. В документе MSDN явно указано, что управляемые/неуправляемые прагмы не должны использоваться до включения операторов.

#pragma warning(disable: 4793) // methods are compiled as native (clr warning)
#include <cv.h>
#pragma warning(pop)

Ответ 3

Если вы не можете изменить существующие файлы кода, вы можете избавиться от предупреждения, отключив поддержку CLR для конкретного файла, который показывает предупреждение 4793, Конечно, это работает только в том случае, если этот файл не использует функции CLR.

Чтобы отключить поддержку CLR для определенного файла, найдите его в обозревателе решений, щелкните правой кнопкой мыши и откройте его страницы свойств. Установите поддержку RunTime для обычного языка без поддержки обычного языка RunTime. Не забудьте сделать это для всех конфигураций и всех платформ.

Отключить поддержку CLR для каждого файла