вопрос по DLL в С++

irina-sokolov

Вызываю из одной DLL функции в другой DLL.
Линкер ругается на неопределенную функцию _main.
Кто-нибудь может сказать, в чем дело?

freezer

глобальные переменные есть, для которых надо инициализацию выполнять? ну типа такого:
int f=sin(1);
или так:
struct A
{
A{}
} a;

irina-sokolov

вроде есть.

psm-home

Компоновщик хочет символ _main, соответствующий функции main т.е точке входа в консольное приложение. Вероятнее всего, Вы передаете компоновщику неверные опции и он думает, что это у Вас console application, а не DLL. Проект для DLL стандартным мастером создавали или как? Смотрите на закладке Link в Project Settings (Alt-F7) поле Project Options. Там будет командная строка линкера, что-то вроде:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /dll /incremental:no /pdb:"Release/adc.pdb" /machine:I386 /out:"Release/adc.dll" /implib:"Release/adc.lib"
Обратите внимание на ключ /dll. У Вас, скорее всего, вместо него будет /subsystem:console. Я попробовал в своём проекте DLL поменять /dll на /subsystem:console и получил описанный Вами эффект. Рискну предположить, что то, что Вы чего-то там вызываете из другой DLL не при чем. Если я был прав, то замена /subsystem:console на /dll поможет. Где менять, см. выше. Также может иметь смысл просто перенести все *.h и *.cpp файлы Вашего проекта в новый workspace созданный мастером New-> вкладка Project->Win32 Dynamic Link Library.

Crash770909

в опциях линкера (если бес МФСИ)
/entry:_DllMainCRTStartup

psm-home

Совет не очень, imho. Хотя бы потому, что...
While it is possible to specify another entry-point function using the /ENTRY: linker switch, it is not recommended because your entry-point function would have to duplicate everything that _DllMainCRTStartup does. When building DLLs in Visual C++, _DllMainCRTStartup is linked in automatically and you do not need to specify an entry-point function using the /ENTRY: linker switch .

The C run-time library behavior and _DllMainCRTStartup, MSDN.

irina-sokolov

обе библиотеки работают из обыкновенных приложений. А когда одну из другой вызываешь, начинаются приключения. Завтра попробую /entry

irina-sokolov

одна библиотека не мной писана. Я хочу вызвать ее из своей библиотеки. В чужой библиотеке есть в хедере определения функций и тайпдефы с дефайнами.
entry point не помогает: начинает ругаться, что функцию такую не знает.
По __DllMainCRTStartup ситуация следующая: ошибка про _main осталась, добавилась та же хрень про __DllMainCRTStartup + еще ошибка по то, что она не __stdcall
Оставить комментарий
Имя или ник:
Комментарий: