Проблема С __declspec(dllimport)

  • Автор темы zeliboba1
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Z

zeliboba1

Гость
#1
Здравствуйте.

Есть библиотека, которую подключаю к программе на с++
(http://forum.ru-board.com/topic.cgi?forum=...mit=1&m=1#1).
Из этой библиотеки делаю импорт структуры и процедуры.
Программу создавал как "пустой проект", выглядит она так:

C++:
//**************************** 
#include <iostream> 
#pragma comment(lib,"fdll.lib") 
using namespace std; 

Extern "C" { 
extern __declspec(dllimport) struct variables { double a; } abc; 
void F(); 
} 

int main() 
{ 
F(); 
std::cout<<abc.a; 
return 0; 
} 

//***************************
Это её рабочий вариант, т.е. в качестве _консольного_ приложения она корректно работает, не выдает предупреждений при сборке.

Теперь встала проблема использовать структуру и функция в приложении типа Windows Forms.
Создаю стандартное приложение Windows Forms, не изменяя пробую запустить - всё Ок, работает.
Теперь хочу глобально объявить мою структуру из библиотеки и процедуру от туда же.
Пишу строчки (которые, как замечу, в консольном приложении работаю):

C++:
 #pragma comment(lib,"fdll.lib") 
Extern "C" { 
extern __declspec(dllimport) struct variables { double a; } abc; 
void F(); 
}
Добавляю их в главный файл .cpp, до функции main().
При сборке получаю предупреждение вида:

warning C4394: abc: символ для каждого домена приложений не следует помечать с помощью __declspec(dllimport)

соответственно при попытке использования импортированной структуры и процедуры - ошибки.

прошу подсказки, в чем дело? почему в консольном приложении работает как положено, а в Windows Forms нет, при том что
располагаю объявление структуры, как мне кажется, в одном и том же месте... MS VS 2008
 

a0z

Well-Known Member
15.03.2011
108
0
#2
Не волнуйся, тут полно телепатов. Сообщение об ошибке им не нужно, сами догадаются.
Жди.
 
Z

zeliboba1

Гость
#3
Уважаемый, Ваш сарказм тут не к месту. Ошибки не будет, пока не захочу использовать элементы структуры.
Тема о том, как убрать warning, и почему он собственно появляется.
Самому мне не ясно, ввиду того, что с срр только начинаю разбираться.
Вводной информации, Вам, теперь достаточно. Думаю теперь есть что по делу сказать?
 
Z

zeliboba1

Гость
#5
Так а в справке что написано по этому поводу?
После чтения всякого что я знаю:
1) описание предупреждения http://msdn.microsoft.com/ru-ru/library/ms173692.aspx , но это не шибко выручает.
2) как я понял, настройка среды для каждого типа приложений свои, поэтому подобные вещи и возникают.
http://msdn.microsoft.com/ru-ru/library/ms...1(v=vs.90).aspx там есть вот такой интересный пункт:
Разверните узел Свойства конфигурации и выберите пункт Общие. Справа, в области Значения по умолчанию для проекта установите для параметра Поддержка общеязыковой среды выполнения (CLR) значение Поддержка общеязыковой среды выполнения (/clr).
после этих манипуляций предупреждение исчезает! НО теперь появляется ошибка:
test.obj : error LNK2020: неразрешенная лексема (0A00000E) __imp__abc
test.obj : error LNK2001: неразрешенный внешний символ "__imp__abc"
что собственно неудивительно, т.к. структуры с названием __imp__abc у меня в библиотеки нет.
позже попробую сделать alias в самой библиотеке, но логика подсказывает что дело не в этом, а возможно
в каких-то настройках ещё (ведь в варианте консольного приложения работает). Но в чем именно дело
из-за малого опыта понять не могу пока.

есть какие-нибудь мысли? решение, полагаю, где-то рядом.
 
Z

zeliboba1

Гость
#7
Вы об отом "Try to set CLR switch to /clr (without pure and safe)"?
я так сделал, это и помогло мне убрать warning, но теперь ошибка, из-за того что линковщик добавляет мне _imp_
 

-master-

Well-Known Member
14.01.2012
616
20
#8
А сравните настройки линковщика, в консольном и тут.
 
Z

zeliboba1

Гость
#9
Так, с этой проблемой разобрался. Не знаю насколько это колхозно вышло, но работает.
Что надо сделать:
1) Разверните узел Свойства конфигурации и выберите пункт Общие. Справа, в области Значения по умолчанию для проекта установите для параметра Поддержка общеязыковой среды выполнения (CLR) значение Поддержка общеязыковой среды выполнения (/clr).
2) Свойства проекта -> Свойства конфигурации -> с/с++ -> предварительно скомпилированные заголовки -> не использовать

-master, спасибо за участие. карму плюсануть не получается:/
 

a0z

Well-Known Member
15.03.2011
108
0
#10
Уважаемый, Ваш сарказм тут не к месту. Ошибки не будет, пока не захочу использовать элементы структуры.
Тема о том, как убрать warning, и почему он собственно появляется.
Самому мне не ясно, ввиду того, что с срр только начинаю разбираться.
Вводной информации, Вам, теперь достаточно. Думаю теперь есть что по делу сказать?
Я опять таки повторяюсь, что вы пишете телепатам.
У вас в вопросе ясно сказано "почему в консольном приложении работает как положено, а в Windows Forms нет". Если не работает и интересно почему - давайте ошибки.
Если интересно почему возникает варнинг, так и спросите.
 
Статус
Закрыто для дальнейших ответов.