口碑好的网站建设方法有哪些服装网站搭建计划书
web/
2025/10/8 6:36:40/
文章来源:
口碑好的网站建设方法有哪些,服装网站搭建计划书,网站建设的需求怎么写,有特效的网站前段时间编译一个引用自己写的静态库的程序时老是出现链接时的多个重定义的错误#xff0c;而自己的代码明明没有重定义这些东西#xff0c;譬如#xff1a; LIBCMT.lib(_file.obj) : error LNK2005: ___initstdio already defined in libc.lib(_file.obj) LIBCMT.lib(_fi…前段时间编译一个引用自己写的静态库的程序时老是出现链接时的多个重定义的错误而自己的代码明明没有重定义这些东西譬如 LIBCMT.lib(_file.obj) : error LNK2005: ___initstdio already defined in libc.lib(_file.obj) LIBCMT.lib(_file.obj) : error LNK2005: ___endstdio already defined in libc.lib(_file.obj) LIBCMT.lib(_file.obj) : error LNK2005: __cflush already defined in libc.lib(_file.obj) LIBCMT.lib(_file.obj) : error LNK2005: __iob already defined in libc.lib(_file.obj) LIBCMT.lib(osfinfo.obj) : error LNK2005: __alloc_osfhnd already defined in libc.lib(osfinfo.obj) LIBCMT.lib(osfinfo.obj) : error LNK2005: __set_osfhnd already defined in libc.lib(osfinfo.obj) LIBCMT.lib(osfinfo.obj) : error LNK2005: __free_osfhnd already defined in libc.lib(osfinfo.obj) LIBCMT.lib(osfinfo.obj) : error LNK2005: __get_osfhandle already defined in libc.lib(osfinfo.obj) LIBCMT.lib(osfinfo.obj) : error LNK2005: __open_osfhandle already defined in libc.lib(osfinfo.obj) LIBCMT.lib(tolower.obj) : error LNK2005: __tolower already defined in libc.lib(tolower.obj) LIBCMT.lib(tolower.obj) : error LNK2005: _tolower already defined in libc.lib(tolower.obj) 等等。
所 以初步估计是编译器的问题通过网上搜索和查看msdn原来是Visual C 编译器选项的关于单线程或多线程运行时例程的问题我的那个静态库编译时/ML单线程版本的而引用它的程序是/MT多线程版本的他们在编译分别讲 libc.lib和LIBCMT.lib连接到各自的代码中估计libc.lib和LIBCMT.lib只是单线程与多线程的区别基本代码相差无几 所以会产生链接时重定义错误然后把编译静态库的选项/ML改成/MT就没事了。
要注意的是/MD也是多线程版本的被应用的用户链接库 要和应用者有相同的编译选项/MD与/MT一起有时候会有错误的有时候就没有我试过这种情况而/MD和/ML似乎是没有问题的/MT和/ML是 肯定会有问题的。有没有其他情况就不清楚了有兴趣的可以测试一下^_^
如果是代码是用于多线程的最好编译成多线程版本的否则可能会出现一些意想不到的问题。
编译器选项设置vc6工程 - 设置 - C/C - 工程选项 里可以修改 附 下面是msdn关于Visual C 编译器选项的说明
这些选项选择单线程或多线程运行时例程指示多线程模块是否为 DLL并选择运行时库的发布版本或调试版本。
选项说明/MD定义 _MT 和 _DLL 以便同时从标准 .h 文件中选择运行时例程的多线程特定版本和 DLL 特定版本。此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR71.DLL 中该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。当 在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时它将导致应用程序通过静态多线程标准 C 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 进行链接同时仍通过 msvcrt.lib 动态链接到主 CRT。/MDd定义 _DEBUG、_MT 和 _DLL以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。/ML使编译器将库名 LIBC.lib 放入 .obj 文件中以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。/MLd定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。/MT定义 _MT 以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中以便链接器使用 LIBCMT.lib 解析外部符号。创建多线程程序需要 /MT 或 /MD或它们的调试等效选项 /MTd 或 /MDd。/MTd定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中以便链接器使用 LIBCMTD.lib 解析外部符号。创建多线程程序需要 /MTd 或 /MDd或它们的非调试等效选项 /MT 或 MD。/LD创建 DLL。将 /DLL 选项传递到链接器。链接器查找 DllMain 函数但并不需要该函数。如果没有编写 DllMain 函数链接器将插入返回 TRUE 的 DllMain 函数。链接 DLL 启动代码。如果命令行上未指定导出 (.exp) 文件则创建导入库 (.lib)将导入库链接到调用您的 DLL 的应用程序。将 /Fe 解释为命名 DLL 而不是 .exe 文件默认程序名成为基名称.dll 而不是基名称.exe。如果还未显式指定 /M 选项之一则将默认运行时库支持更改为 /MT。/LDd创建调试 DLL。定义 _DEBUG。 警告 不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题因为副本中的静态数据不与其他副本共享。链接器禁止在 .exe 文件内部既使用静态版本又使用动态版本链接但您仍可以使用运行时库的两个或更多副本。例如当与用动态 (DLL) 版本的运行时库链接的 .exe 文件一起使用时用静态非 DLL版本的运行时库链接的动态链接库可能导致问题。还应该避免在一个进程中混合使用这些库的调试版本和非调试版本。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88917.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!