Проект ATL, созданный с помощью мастера, не компилируется из-за неразрешенных символов - PullRequest
1 голос
/ 27 июля 2010

Я работал над созданием базового проекта 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 ошибок, которые я перечислил в начале этого вопроса.

Есть идеи? Я пропускаю что-то простое?

Ответы [ 2 ]

1 голос
/ 27 июля 2010

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

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

1 голос
/ 27 июля 2010

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

dumpbin someproject_i.obj /symbols | find "LIBID"

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

...