Я работал над получением основного проекта ATL скомпилировать в Visual Studio 2008, и я продолжаю сталкиваться с ошибками. В конечном счете я застрял со следующими ошибками сборки:
1>Linking...
1> Creating library Debug\SomeProject.lib and object Debug\SomeProject.exp
1>dllmain.obj : error LNK2001: unresolved external symbol _LIBID_SomeProjectLib
1>SomeObject.obj : error LNK2001: unresolved external symbol _LIBID_SomeProjectLib
1>SomeObject.obj : error LNK2001: unresolved external symbol _IID_ISomeObject
1>Debug\SomeProject.dll : fatal error LNK1120: 2 unresolved externals
Что я пропускаю или делаю неправильно? Вот шаги для репродуцирования.
ATL Project
именованный SomeProject
. Примите все значения по умолчанию.Add > Class
.ATL Simple Object
и войдите SomeObject
как его Краткое название. Примите все другие значения по умолчанию.В этом указывает на прекрасные сборки проекта. Однако я хочу разделить свой IDL среди нескольких файлов для лучшей организации (мой IDL был бы тысячами строк долго).
Add > New Item
.Midl File
и войдите ISomeObject
как его имя файла.SomeProject.idl
и сокращение ISomeObject
объявление интерфейса. Замените его import "ISomeObject.idl";
.ISomeObject.idl
.Для удовлетворения компилятора IDL Microsoft, мы должны изменить некоторые опции:
MIDL > Output
разделите и введите следующие значения: $(InputName).h
$(InputName)_i.cpp
$(InputName)_p.cpp
No
C/C++ > Precompiled Headers
раздел и набор Create/Use Precompiled Header
кому: Not using Precompiled Header
. Существуют ошибки позже, если предварительно скомпилированные заголовки используются.SomeProject.idl
файл так, чтобы его свойства были отображены. Перейдите в MIDL > Output
раздел и набор Generate Type Library
кому: Yes
.SomeProject_i.h
и SomeProject_i.c
от Generated Files
фильтр.Generated Files
фильтр. Вы, возможно, должны попытаться скомпилировать проект сначала. SomeProject.h
SomeProject_i.cpp
ISomeObject.h
ISomeObject_i.cpp
Теперь, в этой точке я ожидал бы проект скомпилировать. Но это не делает. Необходимо добраться LNK1120
ошибки, которые я перечислил во главе этого вопроса.
Какие-либо идеи? Я пропускаю что-то простое?
Не уверен, что вы делаете, или почему вы это делаете, но где-то по пути вы потеряли файл исходного кода blah_i.c, который генерирует midl.exe. Он содержит GUID интерфейсов, классов и библиотеки типов, на которые жалуется компоновщик. Если вы не можете его найти, поищите MIDL_DEFINE_GUID в *.c файлах.
Edit: Теперь я вижу проблему, вы переименовали blah_i.c в blah_i.cpp. Это неправильно, файл содержит объявления языка C. Компилятор по-другому обрабатывает идентификаторы, когда он компилируется как код C++. Переименуйте его обратно в .c. Или используйте опцию компиляции /Tc.
Откройте командную строку VS 2008, перейдите в промежуточный / выходной каталог и посмотрите someproject_i.obj. Попробуйте что-нибудь вроде этого:
dumpbin someproject_i.obj /symbols | find "LIBID"
Если в объектном файле не определено libid, проблема в этом. Может, у него как-то неправильное название? Если есть один с правильным именем, проблема в том, что компоновщик его не использует.