相关疑难解决方法(0)

在不获取LNK4006的情况下,将库与Visual C++中的依赖项链接起来

我有一组静态编译的库,库之间具有相当深的依赖性.例如,可执行文件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)中定义; 忽略第二个定义.

如何在不收到警告的情况下完成此操作?有没有办法简单地禁用警告,还是有更好的方法?

编辑:我看到不止一个答案表明,由于缺乏更好的替代方案,我只是禁用警告.嗯,这是问题的一部分:我甚至不知道如何禁用它!

warnings module visual-c++

21
推荐指数
2
解决办法
2万
查看次数

如何针对发布版本的lib(MSVCRT.lib)构建调试.exe(MSVCRTD.lib)?

我正在使用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)

c++ linker visual-studio visual-c++

5
推荐指数
1
解决办法
6400
查看次数

标签 统计

visual-c++ ×2

c++ ×1

linker ×1

module ×1

visual-studio ×1

warnings ×1