Ошибка при создании DLL
От: Ivanalt  
Дата: 28.06.07 11:33
Оценка:
В "Поиске" уже смотрел... вроде на мою ошибку не похоже...
может быть, конечно, эта тема не совсем для ветки MFC...

А пишет мне Visual Studio 6.0 вот такую бяку:
Linking...
   Creating library ReleaseUMinDependency/Modbus_Side.lib and object ReleaseUMinDependency/Modbus_Side.exp
LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
ReleaseUMinDependency/Modbus_Side.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Modbus_Side.dll - 2 error(s), 0 warning(s)


Знающие люди говорят, что ошибка может связана с этой функцией
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )


Визуал студио генерит такую кучу файлов, что я в половину даже не заглядываю,
но нашел в файлах проги следующий текст:
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        _Module.Init(ObjectMap, hInstance, &LIBID_MODBUS_SIDELib);
        DisableThreadLibraryCalls(hInstance);
    }
    else if (dwReason == DLL_PROCESS_DETACH)
        _Module.Term();
    return TRUE;    // ok
}


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

Может быть, есть смысл поменять WINAPI на APIENTRY ???


03.07.07 10:32: Перенесено модератором из 'MFC' — SchweinDeBurg
Re: Ошибка при создании DLL
От: febus Германия  
Дата: 28.06.07 12:03
Оценка:
Здравствуйте, Ivanalt, Вы писали:
Пишете вы явно не на MFC, а на ATL. Вопрос скорее в соотв. форум по ATL.
Вариантов тут много, вы дали слишком мало информации. Возможно у вас определен _ATL_MIN_CRT и в то же время вы пытаетесь обратиться к функции CRT.
Название конфигурации у вас соответствующее: ReleaseUMinDependency, что наводит на мысли об определенном _ATL_MIN_CRT.
Если уберете _ATL_MIN_CRT и оно заработает, то либо так и сделайте, либо ищите что именно из CRT вы используете и откажитесь от этого/перепишите без CRT.


здесь
здесь
Re[2]: Ошибка при создании DLL
От: Ivanalt  
Дата: 28.06.07 12:17
Оценка:
Здравствуйте, febus, Вы писали:

F>Если уберете _ATL_MIN_CRT и оно заработает, то либо так и сделайте, либо ищите что именно из CRT вы используете и откажитесь от этого/перепишите без CRT.


Откуда его надо убрать??? Поиск внутри программы ничего не дает:
Searching for '_ATL_MIN_CRT'...
Cannot find the string '_ATL_MIN_CRT'.

Searching for 'CRT'...
Cannot find the string 'CRT'.




И может ли кто-нибудь из админов переместить эту тему в ветку по ATL???
Re[3]: Ошибка при создании DLL
От: Ivanalt  
Дата: 02.07.07 10:55
Оценка:
Project->Settings->C++->Preprocessor: удаляем из списка _ATL_MIN_CRT
И в результате получаем: Modbus_Side.dll — 0 error(s), 0 warning(s)
главное, чтоб без него всё работало...)))
Re[4]: Ошибка при создании DLL
От: febus Германия  
Дата: 02.07.07 11:41
Оценка:
Здравствуйте, Ivanalt, Вы писали:

I>Project->Settings->C++->Preprocessor: удаляем из списка _ATL_MIN_CRT

I>И в результате получаем: Modbus_Side.dll — 0 error(s), 0 warning(s)
I>главное, чтоб без него всё работало...)))


Я бы все же на вашем месте попытался выяснить, что именно из CRT используется. С высокой вероятностью это будет фунцкия strcmp,
которая прекрасно заменяется на API функцию lstrcmp.
Все жe на ATL/WTL пишете. А раз так, то вопрос размера программы вас должен интересовать
Поставьте упонянутую линкером библиотеку libcmt.lib в строку Ignore Libraries в конфигурации проекта. Тогда он начнет ругаться названиями функций, которые
вы используете из CRT. Дальше поиск по проекту этих функций и замена на их API аналоги(если это конечно возможно).


To find out what is causing the problem, do one of the following:
• Open the Project Settings dialog box, select the Link tab, and click Input in the Category box. Type LIBCMT.LIB in the Ignore libraries text box. Now do a build. You will get a list of unresolved externals. This list contains the CRT routines you are using. Look for the routines that you think may require the startup code.
• Turn on the /VERBOSE linker option. From the resulting linker output, you can find a list of routines that require the CRT startup code.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.