【问题标题】:MFC CString Linker error between two projects两个项目之间的 MFC CString 链接器错误
【发布时间】:2013-02-03 05:01:15
【问题描述】:

我有 2 个 C++ (MFC) 项目 一个是我在第二个(可执行的)中使用的库项目。

它们一起工作得很好,直到我从常规项目中调用一个以 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> > >)" (?SetText1@CTextDisplay@@QAEXV?$CStringT@_WV?
$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z) referenced in function 
"public: void __thiscall CManualPane::SetBeadCountFor(int,double)" 
(?SetBeadCountFor@CManualPane@@QAEXHN@Z)    C:\source\IQ-Project\IQ\ManualPane.obj  IQ

可执行项目将其字符集设置为 UNICODE,但库将其设置为多字节字符集。我真的无法更改它们而不会出现大量可笑的错误。

有什么建议吗?

编辑:我们在这两个项目中设置不同的原因是因为可执行项目基本上是我的小组没有构建或创建的外部项目。我们只需要把它带进来并使用它。图书馆项目是我们几年来一直在努力的事情。

【问题讨论】:

  • 调用库中采用 int 的函数(例如)没有问题
  • 我不确定您将哪个称为 常规项目,但假设您正在调用库项目中返回 CString 的函数,请尝试存储在 exe 项目中以 CStringA 的形式返回值。但即使编译成功,如果两者的 UNICODE 设置不同,我也会警惕从库中传递 MFC 类型。
  • 在设计库的界面时,CString 类型的参数是相当邪恶的事情。
  • 在调用此函数时,您可能需要从 A 转换为 W(或从 W 转换为 A)
  • @irco 然后在调用库函数之前将其转换为exe中的CStringA。我相信这可以通过CStringA cstra( source_cstr.GetString() ); libfunction( cstra );

标签: c++ mfc cstring unicode-string


【解决方案1】:

当您在可执行文件中包含库项目的标头时,可能会在函数声明中使用 typedef。由于可执行文件使用 UNICODE,因此声明现在使用 UNICODE。但是,库实现仍然在 MultiByte 中,因此定义与导致链接器错误的声明不匹配。

查看这些 typedef 是如何设置的,您可能可以在包含的标头周围做一些特殊的#define、#undef。

【讨论】:

【解决方案2】:

最终证明,避免在同一解决方案中使用 unicode 和多字节项目是一个更好的主意,因此我将其全部移至 unicode 并从那里开始

【讨论】:

    猜你喜欢
    • 2010-12-03
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2019-02-28
    相关资源
    最近更新 更多