О непоследовательной связи DLL
Как удалить эту ссылку? Вы можете увидеть сегмент кода, который вызывает это предупреждение.
static AFX_EXTENSION_MODULE GuiCtrlsDLL = { NULL, NULL };
//bla bla
// Exported DLL initialization is run in context of running application
extern "C" void WINAPI InitGuiCtrlsDLL()
{
// create a new CDynLinkLibrary for this app
new CDynLinkLibrary(GuiCtrlsDLL);
// nothing more to do
}
предупреждение C4273: 'InitGuiCtrlsDLL': inconsisten
t dll link
У меня также есть определения экспорта и импорта, например:
#ifdef _GUICTRLS
#define GUI_CTRLS_EXPORT __declspec(dllexport)
#else
#define GUI_CTRLS_EXPORT __declspec(dllimport)
#endif
Ответы
Ответ 1
Существует несколько возможностей:
1) static AFX_EXTENSION_MODULE GuiCtrlsDLL = { NULL, NULL };
Вы используете AFX_EXTENSION_MODULE. Это означает, что вы используете DLL расширения MFC. Для таких расширений dll вам необходимо определить препроцессор _AFXEXT. Установите это в настройках компилятора С++ проекта Visual С++
см
Как использовать _declspec (dllexport) в DLL расширения MFC: http://support.microsoft.com/kb/128199
(В настоящее время я не могу опубликовать более 1 ссылки, потому что моя репутация меньше 10. Я добавлю еще 2 важных ссылки позже. Поэтому, если это решение, отметьте его как ответ для ускорения процесса;))
Как и было обещано, вот две ссылки:
AFX_EXTENSION_MODULE Структура: http://msdn.microsoft.com/en-us/library/sxfyk0zk.aspx
TN033: DLL-версия MFC: http://msdn.microsoft.com/en-us/library/hw85e4bb.aspx
2) Вероятно, у вас есть дублированное определение/декларация.
Ответ 2
Назначение инструкций препроцессора:
#ifdef _GUICTRLS
#define GUI_CTRLS_EXPORT __declspec(dllexport)
#else
#define GUI_CTRLS_EXPORT __declspec(dllimport)
#endif
должен убедиться, что файл заголовка объявляет класс или функцию как __declspec (dllexport) в .dll, где он определен, и как __declspec (dllimport) для любой другой DLL, которая может захотеть использовать его.
Чтобы это сработало, _GUICTRLS должен быть определен при компиляции экспортируемой .dll и не определен для любой другой .dll. Как правило, вы ожидаете, что _GUICTRLS будут определены в свойствах проекта, в разделе C/С++ → Preprocessor → Определения препроцессора.
Ошибка компилятора, которую вы видите, обычно происходит потому, что либо _GUICTRLS не определен для проекта, который выполняет экспорт, или он определен для нескольких проектов, как правило, из-за сокращения вставки из одного проекта в другой. Вы также увидите это, если _GUICTRLS определен в файле заголовка, который включен в несколько проектов.
Ответ 3
Это предупреждение обычно вызвано дублирующим определением функции с различным использованием dllimport. Вы уверены, что не сделали этого?
Ответ 4
[CMOS несовместимая связь dll]
Я столкнулся с следующим решением проблемы + с __declspec (dllexport) + __declspec (dllimport):
# # #CMakeLists.txt
add_defintions(-DMYLIB=1)
# The above was the solution...
# (MYLIB is used in the standard ifdef + define MYLIB_EXPORT syntax)
# Below: seems to get overruled by other directory headers:
set_source_files_properties( file1.h file2.h COMPILE_FLAGS "-DMYLIB=1")
Это было неприятно, потому что несколько источников говорят, что используют команду "установить исходные параметры файла", чтобы получить лучшую детализацию, но документ не ясно, что происходит с file1.h объявляет, когда он включен из другого каталога... лучше наклейте add_definitions( -DMYLIB=1 )
на данный момент!
Чтобы уловить эту проблему: в файле Foo.cpp:
#include "export.h"
#if defined(MYLIB)
#if defined(OTHERLIB)
static_assert(0,"error, check your definitions!");
// OTHER depends on MY; can't have both of these flags being set!
#endif
#endif
struct OTHER_EXPORT foo
{
};
Ответ 5
В дополнение к чтению предупреждающего сообщения обратите внимание на то, где он встречается, если у вас несколько проектов как часть рабочей области.
Я потратил время на поиск проблемы в своей DLL, которая правильно компилировалась и правильно связывалась. В рабочей области также было создано основное приложение, а моя ошибка заключалась в том, что я случайно включил новый (DLL) исходный файл в список файлов сборки самого приложения.
Основная программа требует, чтобы заголовок DLL mynewdll.h импортировал вещи, но не требует исходного файла mynewdll.cpp. (Код запускается во время выполнения с помощью DLL.) У меня есть привычка включать файлы заголовка и кода в проекты в виде пары, и именно здесь я ошибся.
Я бы обнаружил ошибку намного раньше, если бы был готов, и заметил, что проект DLL связан без ошибок, и это была основная программа, которая жаловалась!
Мой исходный код и проект DLL были свободны от ошибок, и это было только так, как я пытался создать свой исполняемый файл, который был неисправен.
Ответ 6
Посмотрите, что вы не определяете экспортированные символы в другом проекте. Также очистите все промежуточные файлы вручную и перекомпилируйте.