Проект ATL, созданный с помощью мастера, не компилирует из-за неразрешенных символов

Я работал над получением основного проекта 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

Что я пропускаю или делаю неправильно? Вот шаги для репродуцирования.

  1. Создайте новое ATL Project именованный SomeProject. Примите все значения по умолчанию.
  2. Щелкните правой кнопкой по проекту в Проводнике Решения и выборе Add > Class.
  3. Выбрать ATL Simple Object и войдите SomeObject как его Краткое название. Примите все другие значения по умолчанию.

В этом указывает на прекрасные сборки проекта. Однако я хочу разделить свой IDL среди нескольких файлов для лучшей организации (мой IDL был бы тысячами строк долго).

  1. Щелкните правой кнопкой по проекту и выбору Add > New Item.
  2. Выбрать Midl File и войдите ISomeObject как его имя файла.
  3. Открытый SomeProject.idl и сокращение ISomeObject объявление интерфейса. Замените его import "ISomeObject.idl";.
  4. Вставьте объявление интерфейса в ISomeObject.idl.

Для удовлетворения компилятора IDL Microsoft, мы должны изменить некоторые опции:

  1. Щелкните правой кнопкой по проекту и откройте его Свойства. Перейдите в MIDL > Output разделите и введите следующие значения:
    • Заголовочный файл: $(InputName).h
    • Файл IID: $(InputName)_i.cpp
    • Файл прокси: $(InputName)_p.cpp
    • Генерируйте библиотеку типов: No
  2. Перейдите в C/C++ > Precompiled Headers раздел и набор Create/Use Precompiled Header кому: Not using Precompiled Header. Существуют ошибки позже, если предварительно скомпилированные заголовки используются.
  3. Выберите SomeProject.idl файл так, чтобы его свойства были отображены. Перейдите в MIDL > Output раздел и набор Generate Type Library кому: Yes.
  4. Удалить SomeProject_i.h и SomeProject_i.c от Generated Files фильтр.
  5. Добавьте следующие Существующие Объекты к Generated Files фильтр. Вы, возможно, должны попытаться скомпилировать проект сначала.
    • SomeProject.h
    • SomeProject_i.cpp
    • ISomeObject.h
    • ISomeObject_i.cpp

Теперь, в этой точке я ожидал бы проект скомпилировать. Но это не делает. Необходимо добраться LNK1120 ошибки, которые я перечислил во главе этого вопроса.

Какие-либо идеи? Я пропускаю что-то простое?

1
задан M. Dudley 27 July 2010 в 18:35
поделиться

2 ответа

Не уверен, что вы делаете, или почему вы это делаете, но где-то по пути вы потеряли файл исходного кода blah_i.c, который генерирует midl.exe. Он содержит GUID интерфейсов, классов и библиотеки типов, на которые жалуется компоновщик. Если вы не можете его найти, поищите MIDL_DEFINE_GUID в *.c файлах.

Edit: Теперь я вижу проблему, вы переименовали blah_i.c в blah_i.cpp. Это неправильно, файл содержит объявления языка C. Компилятор по-другому обрабатывает идентификаторы, когда он компилируется как код C++. Переименуйте его обратно в .c. Или используйте опцию компиляции /Tc.

1
ответ дан 2 September 2019 в 22:40
поделиться

Откройте командную строку VS 2008, перейдите в промежуточный / выходной каталог и посмотрите someproject_i.obj. Попробуйте что-нибудь вроде этого:

dumpbin someproject_i.obj /symbols | find "LIBID"

Если в объектном файле не определено libid, проблема в этом. Может, у него как-то неправильное название? Если есть один с правильным именем, проблема в том, что компоновщик его не использует.

1
ответ дан 2 September 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: