2012-03-19 3 views
0

Я использую CreateProcess для вызова cl и link для компиляции и связывания другой программы на C++ (TestProg.cxx) в DLL.Как скомпилировать и связать программу на C++ в DLL во время выполнения

TestProg.cxx содержит следующие функции: DllMain

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 
{ 
    return TRUE; 
} 

и я добавил /Entry:DllMain к параметрам линии связи.

я получаю следующие ошибки: увязка

LINK : error LNK2001: unresolved external symbol _DllMain 

main.obj : error LNK2001: unresolved external symbol __RTC_Shutdown 

main.obj : error LNK2001: unresolved external symbol __RTC_InitBase 

main.dll : fatal error LNK1120: 3 unresolved externals 

Не могли бы вы, пожалуйста, дайте мне знать, как это исправить? Спасибо

+0

Я предполагаю, что вы видите проблемы с изменением имени C++. –

+2

Вряд ли; 'extern" C "- это правильный способ указать, что вы хотите C, а не C++ name mangling. Но даже C имеет название mangling, как вы можете видеть из ведущего '_' – MSalters

+0

Прохладной информации, спасибо. –

ответ

1

Вам не хватает библиотеки CRT (C). Например, он предоставляет функцию __RTC_Shutdown. Когда вы связываете его, он запускается до вашего DllMain, обернув его. Это также решит вашу первую ошибку связи.

+0

Спасибо за ваш комментарий. Я тестировал свой код с помощью '/ LD' по параметрам копирования, с опцией'/DLL' и с параметрами «/ DLL» в параметрах привязки, я получил те же ошибки привязки. Без обоих я получил ошибку 'LINK: фатальная ошибка LNK1221: подсистема не может быть выведена и должна быть определена'. Использование опции «/ SUBSYSTEM» кажется неправильным, поскольку: «Сообщает операционной системе, как запускать файл .exe», но когда я добавил его, снова появятся те же ошибки ссылок. Пожалуйста, дайте мне знать, как добавить CRT (я не нашел вариант/CRT). Благодаря! – ZOK

+0

@ZOK: Обычное решение - передать '/ MT' в _compiler_. Существует несколько версий CRT, и выбор компоновщика должен соответствовать компиляторам. Поэтому компоновщик читает из файла .obj то, что сделал компилятор. Но, как я уже говорил ранее, вы, вероятно, не должны вызывать лайнер и оставить это CL.exe – MSalters

+0

Спасибо за ваш комментарий. Я не ссылаюсь на компоновщик, я оставляю это на 'cl'. Передача '/ MT' компилятору, я получил ошибку:' LINK: фатальная ошибка LNK1221: подсистема не может быть выведена и должна быть определена'. Передача '/ SUBSYSTEM: WINDOWS' в компоновщик снова приводит к ошибкам связи 3. Пожалуйста, дайте мне знать, как это исправить. Благодаря! – ZOK