静态库和动态库编译问题

StrokeAce 2014-08-01 10:11:24
c++编程,我用了一个第三方的静态库libcpmtd.lib,和我自己的一个动态库GlbCommD.lib之间出现一个问题,错误信息:
1>GlbCommD.lib(GlbCommd.dll) : error LNK2005: "public: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) already defined in jsonlibmtd.lib(json_reader.obj)
1>GlbCommD.lib(GlbCommd.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator+=(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@ABV01@@Z) already defined in jsonlibmtd.lib(json_reader.obj)
1>GlbCommD.lib(GlbCommd.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator+=(char const *)" (??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z) already defined in jsonlibmtd.lib(json_reader.obj)
1>GlbCommD.lib(GlbCommd.dll) : error LNK2005: "public: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::empty(void)const " (?empty@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE_NXZ) already defined in jsonlibmtd.lib(json_reader.obj)
1>GlbCommD.lib(GlbCommd.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in jsonlibmtd.lib(json_reader.obj)
1>GlbCommD.lib(GlbCommd.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) already defined in jsonlibmtd.lib(json_reader.obj)
1>GlbCommD.lib(GlbCommd.dll) : error LNK2005: "public: unsigned int __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::length(void)const " (?length@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ) already defined in jsonlibmtd.lib(json_reader.obj)
1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: void __thiscall std::_Container_base12::_Orphan_all(void)" (?_Orphan_all@_Container_base12@std@@QAEXXZ) already defined in jsonlibmtd.lib(json_reader.obj)
1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: __thiscall std::_Container_base12::~_Container_base12(void)" (??1_Container_base12@std@@QAE@XZ) already defined in jsonlibmtd.lib(json_reader.obj)
1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: __thiscall std::_Container_base12::_Container_base12(void)" (??0_Container_base12@std@@QAE@XZ) already defined in jsonlibmtd.lib(json_reader.obj)
1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: struct std::_Iterator_base12 * * __thiscall std::_Container_base12::_Getpfirst(void)const " (?_Getpfirst@_Container_base12@std@@QBEPAPAU_Iterator_base12@2@XZ) already defined in jsonlibmtd.lib(json_reader.obj)
1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in jsonlibmtd.lib(json_reader.obj)
1>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::_Facet_Register(class std::locale::facet *)" (?_Facet_Register@facet@locale@std@@CAXPAV123@@Z) already defined in msvcprtd.lib(locale0_implib.obj)
1>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP100D.dll)
1>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP100D.dll)
1>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,char const *)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z) already defined in msvcprtd.lib(MSVCP100D.dll)
1>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP100D.dll)
1>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP100D.dll)
1>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP100D.dll)
1>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP100D.dll)
1>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP100D.dll)
1>LIBCMTD.lib(tidtable.obj) : error LNK2005: __encoded_null already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __malloc_dbg already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __free_dbg already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(lconv.obj) : error LNK2005: _localeconv already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(mlock.obj) : error LNK2005: __lock already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(mlock.obj) : error LNK2005: __unlock already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(winxfltr.obj) : error LNK2005: ___CppXcptFilter already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in MSVCRTD.lib(cinitexe.obj)
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRTD.lib(cinitexe.obj)
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRTD.lib(cinitexe.obj)
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRTD.lib(cinitexe.obj)
1>LIBCMTD.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(sprintf.obj) : error LNK2005: _sprintf already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(sprintf.obj) : error LNK2005: _sprintf_s already defined in MSVCRTD.lib(MSVCR100D.dll)
1>LIBCMTD.lib(dbgrptw.obj) : error LNK2005: __CrtDbgReportW already defined in MSVCRTD.lib(MSVCR100D.dll)

这俩库都有用到<string>,请哪位知道的高手告知
...全文
476 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn_boss 2014-08-01
  • 打赏
  • 举报
回复
专业顶帖,收费
  • 打赏
  • 举报
回复
估计你是把工程设置为静态MFC编译。设置为动态编译
StrokeAce 2014-08-01
  • 打赏
  • 举报
回复
引用 10 楼 mlqxj35674 的回复:
名空间改名,避免名称冲突, [quote=引用 9 楼 gaga392464782 的回复:] [quote=引用 4 楼 mlqxj35674 的回复:] #import 特性 #import 可以选择包含一个或多个特性。 这些属性通知编译器修改类型库头文件的内容。 杠 (\) 符号在单个 #import 可以使用语句包括附加的行。 例如: #import "test.lib" no_namespace \ rename("OldName", "NewName")
哥们儿,你说的这个我不太明白[/quote]变量或名空间改名,避免名称冲突,从这方面考虑吧,你的错误信息都是 already defined ,好多符号名称重复定义了,要么排除其中之一,要么改名[/quote] 我这是都引用了string引起的,这个我没法改啊
mlqxj35674 2014-08-01
  • 打赏
  • 举报
回复
名空间改名,避免名称冲突,
引用 9 楼 gaga392464782 的回复:
[quote=引用 4 楼 mlqxj35674 的回复:] #import 特性 #import 可以选择包含一个或多个特性。 这些属性通知编译器修改类型库头文件的内容。 杠 (\) 符号在单个 #import 可以使用语句包括附加的行。 例如: #import "test.lib" no_namespace \ rename("OldName", "NewName")
哥们儿,你说的这个我不太明白[/quote]变量或名空间改名,避免名称冲突,从这方面考虑吧,你的错误信息都是 already defined ,好多符号名称重复定义了,要么排除其中之一,要么改名
StrokeAce 2014-08-01
  • 打赏
  • 举报
回复
引用 4 楼 mlqxj35674 的回复:
#import 特性 #import 可以选择包含一个或多个特性。 这些属性通知编译器修改类型库头文件的内容。 杠 (\) 符号在单个 #import 可以使用语句包括附加的行。 例如: #import "test.lib" no_namespace \ rename("OldName", "NewName")
哥们儿,你说的这个我不太明白
StrokeAce 2014-08-01
  • 打赏
  • 举报
回复
引用 3 楼 bojie5744 的回复:
然后再progma comment
你说的这个是我在工程设置里lib库都添加了的,应该不是这个问题
StrokeAce 2014-08-01
  • 打赏
  • 举报
回复
引用 2 楼 bojie5744 的回复:
libcpmtd.lib 把这些放到exe同位置的地方
我这还没exe呢,是另一个dll工程需要链接libcpmtd.lib和GlbCommD.lib这俩
SiGoYi 2014-08-01
  • 打赏
  • 举报
回复
楼主记住,这种Link错误就是找不到实现,意思是说你在使用外部库时只包含了头文件,却没有把lib文件加载到工程中。加载lib库在vs开发环境有两种办法,一种是#import ,另一种是在工程属性中把lib库加进去。两种效果都是一样的。
mlqxj35674 2014-08-01
  • 打赏
  • 举报
回复
#import "test.lib" no_namespace rename("OldName", "NewName") 用reanme改名
mlqxj35674 2014-08-01
  • 打赏
  • 举报
回复
#import 特性 #import 可以选择包含一个或多个特性。 这些属性通知编译器修改类型库头文件的内容。 杠 (\) 符号在单个 #import 可以使用语句包括附加的行。 例如: #import "test.lib" no_namespace \ rename("OldName", "NewName")
  • 打赏
  • 举报
回复
然后再progma comment
  • 打赏
  • 举报
回复
libcpmtd.lib 把这些放到exe同位置的地方
StrokeAce 2014-08-01
  • 打赏
  • 举报
回复
自己顶一下吧
StrokeAce 2014-08-01
  • 打赏
  • 举报
回复
引用 12 楼 bojie5744 的回复:
估计你是把工程设置为静态MFC编译。设置为动态编译
我试着遍了个动态链接库 貌似能编译过去了 就是不知道运行会不会出问题 先谢谢了
wyx100 2014-08-01
  • 打赏
  • 举报
回复
引用 8 楼 gaga392464782 的回复:
[quote=引用 3 楼 bojie5744 的回复:] 然后再progma comment
你说的这个是我在工程设置里lib库都添加了的,应该不是这个问题[/quote]顶

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧