2013-02-18 2 views
2

У меня есть 2 проекта в C++ (MFC) Один из них - это проект библиотеки, который используется во втором (исполняемый).Ошибка MFC CString Linker между двумя проектами

Они отлично работают, пока я не вызову функцию из обычного проекта, которая принимает CString в качестве аргумента. Я получаю ошибку линкера как этот

error LNK2019: unresolved external symbol "public: void __thiscall 
CTextDisplay::SetText1(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t, 
class ATL::ChTraitsCRT<wchar_t> > >)" ([email protected]@@[email protected]_WV? 
[email protected][email protected][email protected]@@@@@[email protected]@@Z) referenced in function 
"public: void __thiscall CManualPane::SetBeadCountFor(int,double)" 
([email protected]@@[email protected]) C:\source\IQ-Project\IQ\ManualPane.obj IQ 

Исполняемый проекта имеет свой набор символов UNICODE, но библиотека имеет свой набор для Multy-Byte набор chatacter. Я действительно не могу их изменить, не получая смешного количества ошибок.

Любые предложения?

Редактировать: причина, по которой у нас разные настройки в этих двух проектах, заключается в том, что исполняемый проект - это в основном внешний проект, который моя группа не создавала и не создавала. Мы просто должны были принести его и использовать. Проект библиотеки - это то, над чем мы работаем уже пару лет.

+0

Вызов функции в библиотеке, которая принимает Int (например) не вызывает проблем – irco

+1

Я не уверен, какой из них вы называете * регулярным проектом *, но при условии, что вы вызываете функцию в проект библиотеки, которая возвращает 'CString', попробуйте сохранить возвращаемое значение как' CStringA 'в проекте exe. Но даже если это успешно компилируется, я опасаюсь передавать типы MFC из библиотеки, если настройки UNICODE этих двух отличаются. – Praetorian

+0

Аргумент типа 'CString' - довольно злая вещь, которую нужно делать при разработке интерфейса библиотеки. – LihO

ответ

1

В конце концов, это оказалось лучшей идеей, чтобы избежать Юникода и multybyte проектов в том же растворе, так что я переехал все это юникода и пошел оттуда

3

Когда вы включаете заголовки проекта библиотеки в исполняемый файл, вероятно, существует тип typedef, который используется в объявлении функции. Поскольку исполняемый файл использует UNICODE, декларация теперь находится в UNICODE. Однако реализация библиотеки по-прежнему находится в MultiByte, поэтому определение не соответствует объявлению, ведущему к ошибке компоновщика.

Посмотрите, как настраиваются эти typedefs, и вы можете сделать некоторые специальные #define, #undef вокруг включенного заголовка.

+0

Я понимаю, что вы говорите, но я не уверен, где мне нужно, чтобы начать искать. stdafx не имеет ссылки на CString, и я точно не знаю, где еще может быть любой из этих typedefs: – irco

+0

Таблица внизу может помочь http://msdn.microsoft.com/en-us/library/5bzxfsea(v=vs.80) .aspx – thisisdog

Смежные вопросы