Компоновщик С++ Visual Studio 2008 отказывается связываться?

Я бьюсь головой о стену здесь.

Все, что я хочу, это связать статический файл .lib в приложении форм окна cpp! Итак, у меня есть папка include в папке моего проекта, в которой хранятся файлы заголовков для этого .lib (lib — это Yaml-cpp, если кому-то интересно). И у меня есть папка lib, в которой есть файлы .lib для этой библиотеки.

Я проверил это на пустом проекте

1. Я создаю новый проект Windows Forms в VS2008 на C++.

2. Я захожу в свойства проекта - c/c++ общие и дополнительные включаемые каталоги, в которых есть заголовочные файлы yaml-cpp.

3. Я иду к компоновщику и добавляю путь к моему каталогу lib

4. Я иду к компоновщику - ввожу и добавляю свой .lib файл

5. Я проверяю командную строку компоновщика, и она содержит мой файл .lib, поэтому все должно быть настроено.

6. Затем я пишу пример кода в теле функции onbutton (которое появляется в form1.h).

Пример кода взят отсюда http://code.google.com/p/yaml-cpp/wiki/HowToParseADocument и это так же просто, как:

#include <fstream>
#include "yaml.h"

а потом:

std::ifstream fin("test.yaml");
YAML::Parser parser(fin);

YAML::Node doc;
while(parser.GetNextDocument(doc)) {
    //do nothing yet
}

7. Затем я компилирую и получаю 10 «неразрешенных внешних».

Я просмотрел другой проект, который использует ту же библиотеку, и у него точно такая же структура каталогов, такое же имя .lib, добавленное в компоновщик - ввод - дополнительные зависимости, те же файлы .lib и .h. И это работает для этого проекта, но это не работает для меня.

Что в мире не так?

РЕДАКТИРОВАТЬ: я попытался создать новое консольное приложение Windows 32, и оно работало правильно. Затем я попытался создать еще одно новое приложение Windows Forms, но это не удалось.

Это подтверждено сейчас. Те же шаги для связывания библиотеки работают в консольном приложении и не работают в приложении Windows Forms. ЗАЧЕМ?


person Istrebitel    schedule 03.08.2011    source источник
comment
Пожалуйста, не могли бы вы включить конкретные сообщения об ошибках компоновщика? (мое первоначальное предположение состоит в том, что .lib ссылается на другие .lib, и вы не включили их все в настройки компоновщика)   -  person StevieG    schedule 03.08.2011
comment
да, хотя они огромны .... и чтобы уточнить, я проверил другой проект С++, который использует ту же библиотеку, и он ничего не связывал, кроме той библиотеки, которую я также связал (yaml-cppd.lib). есть еще один файл yaml-cpp.lib, но он не был связан с этим проектом, и этот проект работал нормально... и связывание этой второй библиотеки все равно не помогает   -  person Istrebitel    schedule 03.08.2011
comment
1>test_yaml_cpp.obj: ошибка LNK2028: неразрешенный токен (0A000036) public: bool __clrcall YAML::Parser::GetNextDocument(class YAML::Node &) (?GetNextDocument@Parser@YAML@@$$FQAM_NAAVNode@2@@Z ) упоминается в функции private: void __clrcall test_yaml_cpp::Form1::button1_Click(class System::Object ^,class System::EventArgs ^) (?button1_Click@Form1@test_yaml_cpp@@$$FA$AAMXP$AAVObject@System@@ P$AAVEventArgs@4@@Z)   -  person Istrebitel    schedule 03.08.2011
comment
1>test_yaml_cpp.obj: ошибка LNK2028: неразрешенный токен (0A000037) общедоступный: __clrcall YAML::Node::~Node(void) (??1Node@YAML@@$$FQAM@XZ), на который ссылается функция private: void __clrcall test_yaml_cpp ::Form1::button1_Click(класс System::Object ^,класс System::EventArgs ^) (?button1_Click@Form1@test_yaml_cpp@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)   -  person Istrebitel    schedule 03.08.2011
comment
1>test_yaml_cpp.obj: ошибка LNK2028: неразрешенный токен (0A000038) общедоступный: __clrcall YAML::Node::Node(void) (??0Node@YAML@@$$FQAM@XZ), указанный в функции private: void __clrcall test_yaml_cpp: :Form1::button1_Click(класс System::Object ^,класс System::EventArgs ^) (?button1_Click@Form1@test_yaml_cpp@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)   -  person Istrebitel    schedule 03.08.2011
comment
1>test_yaml_cpp.obj: ошибка LNK2028: неразрешенный токен (0A000039) общедоступный: __clrcall YAML::Parser::~Parser(void) (??1Parser@YAML@@$$FQAM@XZ), на который ссылается функция private: void __clrcall test_yaml_cpp ::Form1::button1_Click(класс System::Object ^,класс System::EventArgs ^) (?button1_Click@Form1@test_yaml_cpp@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)   -  person Istrebitel    schedule 03.08.2011
comment
1>test_yaml_cpp.obj: ошибка LNK2028: неразрешенный токен (0A00003A) public: __clrcall YAML::Parser::Parser(class std::basic_istream‹char,struct std::char_traits‹char› › &) (??0Parser@YAML @@$$FQAM@AAV?$basic_istream@DU?$char_traits@D@std@@@std@@@Z), на которые ссылается функция private: void __clrcall test_yaml_cpp::Form1::button1_Click(class System::Object ^, class System::EventArgs ^) (?button1_Click@Form1@test_yaml_cpp@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)   -  person Istrebitel    schedule 03.08.2011
comment
1>test_yaml_cpp.obj: ошибка LNK2019: неразрешенный внешний символ Form1::button1_Click(класс System::Object ^,класс System::EventArgs ^) (?button1_Click@Form1@test_yaml_cpp@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)   -  person Istrebitel    schedule 03.08.2011
comment
Ах я вижу. Ну, есть также четыре из этих неразрешенных внешних ошибок символов, а затем 10 неразрешенных внешних ошибок.   -  person Istrebitel    schedule 03.08.2011
comment
Вы также можете предоставить свою командную строку компоновщика?   -  person StevieG    schedule 03.08.2011
comment
не работает (приложение Windows Forms): /OUT:C:\Documents and Settings\...\Projects\test_win32_forms_yaml\Debug\test_win32_forms_yaml.exe /INCREMENTAL /NOLOGO /LIBPATH:deps\lib /MANIFEST /MANIFESTFILE:Debug\test_win32_forms_yaml. exe.intermediate.manifest /MANIFESTUAC:level='asInvoker' uiAccess='false' /DEBUG /ASSEMBLYDEBUG /PDB:C:\Documents and Settings\Истребитель\Мои документы\Visual Studio 2008\Projects\test_win32_forms_yaml\Debug\test_win32_forms_yaml.pdb /SUBSYSTEM:WINDOWS/ENTRY:main/DYNAMICBASE/FIXED:No/NXCOMPAT/MACHINE:X86/ERRORREPORT:PROMPT libyaml-cppmdd.lib   -  person Istrebitel    schedule 03.08.2011
comment
работает (консольное приложение): /OUT:C:\...\Debug\test_win32_console_yaml.exe /INCREMENTAL /NOLOGO /LIBPATH:deps\lib /MANIFEST /MANIFESTFILE:Debug\test_win32_console_yaml.exe.intermediate.manifest /MANIFESTUAC:level= 'asInvoker' uiAccess='false'/DEBUG/PDB:c:\...\Projects\test_win32_console_yaml\Debug\test_win32_console_yaml.pdb/SUBSYSTEM:CONSOLE/DYNAMICBASE/NXCOMPAT/MACHINE:X86/ERRORREPORT:PROMPT libyaml-cppmdd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib   -  person Istrebitel    schedule 03.08.2011
comment
пришлось опустить длинные пути, так как они не вписывались в ограничение на количество символов - где я оставил \...\ это в основном длинный путь для папки пользователя\папки Visual Studio\папки проекта   -  person Istrebitel    schedule 03.08.2011
comment
libpath — это deps\lib, у вас есть копия libyaml-cppmdd.lib в deps\lib в вашем новом проекте Windows?   -  person StevieG    schedule 03.08.2011
comment
оба проекта содержат одинаковые файлы include/lib. На самом деле, я сомневался, что он читает файл, и попытался добавить x к имени файла - он сразу же пожаловался, что файл не существует. Так что на самом деле оба файла существуют и доступны (каким-то образом) (или, по крайней мере, проверяются на существование)   -  person Istrebitel    schedule 03.08.2011
comment
каков полный путь к каталогу lib?   -  person StevieG    schedule 03.08.2011
comment
попробуйте заменить deps\lib на полный путь к libyaml-cppmdd.lib..   -  person StevieG    schedule 04.08.2011


Ответы (1)


Судя по вашему объяснению, то, что вы сделали, кажется правильным, давайте проведем слепое устранение неполадок.

  1. Попробуйте указать полный путь вместо относительного пути для пути к библиотеке и дополнительных каталогов включения. (но, как вы сказали, файл читается, это должно быть проблемой.)
  2. Если вы используете копию оригинального libyaml-cppmdd.lib и его включаемый файл, проверьте, имеет ли включаемый заголовочный файл ту же версию, что и библиотека.
  3. Проверьте, есть ли какие-либо функции в какой-либо части кода, которые имеют объявление, но не имеют определения.
  4. Проверьте, обращаетесь ли вы к каким-либо частным функциям из библиотеки.

Прочтите эту статью Microsoft об устранении неполадок, связанных с неразрешенным внешним символом.

Надеюсь, поможет!

person Ragesh Chakkadath    schedule 03.08.2011
comment
Ну да, проблема в том, что консольное приложение win 32 РАБОТАЕТ с той же библиотекой, теми же путями, теми же включаемыми файлами! Но приложение Windows Forms НЕ работает (те же пути, те же включаемые файлы, выполняется тот же образец кода). Таким образом, мы можем отбросить 1,2,3,4 как неактуальные :( поскольку все они проходят в консольном приложении win 32. Значит, должно быть что-то не так с приложением Windows Forms? - person Istrebitel; 04.08.2011
comment
проверьте, используете ли вы какие-либо библиотеки win32. Попробуйте включить <windows.h>. Щелкните правой кнопкой мыши проект, Свойства, Компоновщик, Ввод. Удалите $(NoInherit) из параметра Дополнительные зависимости. Если вы используете VS2010, поместите user32.lib в этот параметр. - person Ragesh Chakkadath; 04.08.2011
comment
Также попробуйте установить нормальный режим /clr (обычный режим /clr) - person Ragesh Chakkadath; 04.08.2011
comment
Если ничего из этого не сработало, попробуйте вложить объявления библиотечных функций во включаемый файл с помощью extern C. (наверное последняя стрела в моем колчане :D) - person Ragesh Chakkadath; 04.08.2011