2010-11-29 92 views
3

我链接到VS2008中的一些库。如果我对链接器的了解是正确的,那么MTd用于静态链接,MDd用于动态链接(到DLL)。我的目标是静态链接一些库和其他动态链接。项目选项似乎只对链接器输入中的所有库有一个设置。我将如何做到这一点?Visual Studio:如何为链接器指定不同的运行时库? (/ MTd,MDd等)

+1

我不明白这是如何帮助我。没有关于指定每个库的链接器选项的部分。 – 2010-11-29 20:01:40

回答

3

根据您对新建项目向导提示的回答方式,您的项目在设置完成后将获得一个合理的C运行时库默认值。您可以检查和改变这个(如果需要)如下:

  • 在解决方案资源管理器中右键单击相关项目,选择Properties
  • 外观配置属性下,C/C++,代码生成,运行时库。

但是您可以链接其他库,但您只需指定链接到链接器,输入,附加依赖项下的库。

即使您正在链接到一个DLL,它仍然会有一个.LIB文件(用于DLL的正确形式)来解析外部引用,除非您手动加载该DLL并发现所需的函数入口点。

您确实需要确保链接的LIB文件与您的应用使用相同的CRT,否则事情可能会意外地出错。

+0

我不认为我们彼此了解。你的回答告诉我你对此知道,但我可能不理解。我的运行时库是“多线程调试(/ MTd)”,我的链接器输入是“cg.lib cgD3D9.lib Winmm.lib wininet.lib fbxsdk_20113_1d.lib d3d9.lib d3dx9.lib dinput8.lib dxguid.lib”是否这样做看起来正确?原因是我认为混合调试和发布库会导致问题。 – 2010-11-29 20:07:44

+1

在这里查看Hans的附加信息。 `/ Mxxx`标志决定了只有CRT版本**你当前的项目**链接到 - 每个应用程序必须链接到CRT。您希望使用的任何其他**库都在您的项目属性中命名 - 它们可以是静态或动态的,但是如果您打算链接到任何DLL,则需要确保您的应用程序的CRT已准备好了DLL。任何更清楚? – 2010-11-29 20:10:23

4

不,你在混合它。/MD vs/MT选项只与您链接的CRT版本相关。有两种,即只有在项目中不使用任何DLL的情况下才应使用的静态版本(/ MT)。 DLL版本是您的进程中每个二进制文件都可以共享的版本,这样您就不会有堆分配的痛苦。当内存由一个模块分配并由另一个模块释放时,您会遇到的种种苦恼。

选择您自己的库完全取决于您。混合和匹配很好,链接器只是获得另一种.lib。导入库而不是静态库。请记住在使用DLL时使用/ MD。

0

您描述的链接器选项仅适用于CRT。静态版本将限制你在模块之间共享内存的方式。

您使用的所有其他库将根据您提供(或不提供)链接器的.lib文件进行链接。

有3种方法使用MS库

  1. 静态链接静态库(.LIB equivelant的.o的.A归档)
  2. 静态链接存根(生成的.lib编译LOADLIB/getproc)动态库的
  3. 如果您链接到一个lib,这是预建与MT手动加载一个动态库(LOADLIB/GetProcAddress的)
0

和你所要求的MD是我的问题似乎成为。

反之亦然。

它认为我将不得不下载并重新建立外部依赖关系,因为我现在被捕获到22,当我选择MT时,我的项目/解决方案的某些部分出现构建错误,当我选择MD我得到另一部分的错误..

相关问题