我有一组静态编译的库,库之间具有相当深的依赖性.例如,可执行文件X使用库A和B,A使用库C,B使用库C和D:
X -> A
A -> C
X -> B
B -> C
B -> D
Run Code Online (Sandbox Code Playgroud)
当我将X与A和B链接时,如果C和D也没有添加到库列表中,我不想得到错误 - A和B在内部使用这些库的事实是X不应该需要的实现细节要了解.此外,当在依赖关系树中的任何位置添加新依赖项时,必须重新配置使用A或B的任何程序的项目文件.对于深度依赖关系树,所需库的列表可能变得非常长且难以维护.
所以,我正在使用A项目中Librarian部分的"Additional Dependencies"设置,添加C.lib.在B项目的同一部分,我添加了C.lib和D.lib.这样做的结果是图书馆员将C.lib捆绑成A.lib,将C.lib和D.lib捆绑成B.lib.
但是,当我链接X时,A.lib和B.lib都包含它们自己的C.lib副本.这导致了大量的警告
A.lib(c.obj):警告LNK4006"符号"(_symbol)已在B.lib(c.obj)中定义; 忽略第二个定义.
如何在不收到警告的情况下完成此操作?有没有办法简单地禁用警告,还是有更好的方法?
编辑:我看到不止一个答案表明,由于缺乏更好的替代方案,我只是禁用警告.嗯,这是问题的一部分:我甚至不知道如何禁用它!
我正在使用Visual C++ 2008,SP1.我在调试构建配置中有一个QT应用程序(gui,.exe).它设置为使用CRT的多线程调试DLL版本,即MSVCRTD.lib.
我正在链接第三方库,该库是在发布模式下构建的,并使用CRT的多线程DLL(非调试)版本,即MSVCRT.lib.
它链接并运行但在启动时崩溃.在链接时我收到警告:
链接:警告LNK4098:defaultlib'MSVCRT'与使用其他库冲突; 使用/ NODEFAULTLIB:库
我尝试设置/NODEFAULTLIB:msvcrt.lib
但由于缺少符号,导致5个链接错误.
所以不可能使用两个不同的库吗?有什么选择?我可以从我拥有的第三方库中创建一个DLL吗?或者这是第三方必须做的事情?
启动时的例外是:
"在MyApp.exe中......处理未处理的异常:......访问冲突读取位置0x00000000f"
以下是应用程序运行后的调用堆栈,它崩溃了:
MyApp.exe!std::_Aux_cont::_Getcont() + 0xa bytes C++
MyApp.exe!std::_Iterator_base_aux::_Getmycont() + 0x1b bytes C++
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::const_iterator::operator*() + 0x28 bytes C++
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::iterator::operator*() + 0xf bytes C++
MyApp.exe!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> > >::operator[]() + 0xe9 bytes C++
MyApp.exe!ThirdPartyLib::client::`anonymous namespace'::init_xlt_mode() + 0x5f bytes C++
MyApp.exe!_GetCommandLineW@0() + 0x8d8f3 bytes C++ …Run Code Online (Sandbox Code Playgroud)