HL2004的个人博客分享 http://blog.sciencenet.cn/u/HL2004

博文

fortran LINK : warning LNK4098 && error LNK2001

已有 7284 次阅读 2011-7-8 21:51 |系统分类:科研笔记| error, LNK4098, LNK2001

我用fortran写的程序编译通过,在组建时出现问题,问题提示如下:

Linking...
LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library
Algorithm.obj : error LNK2001: unresolved external symbol _SGLUNDATEBUFFER@0
Debug/Algorithm.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

 在网上查找解决方案,得到的解答方案如下:

project-setting-link-> Category(input)-> Ignore   libraries里面添上这些库!

添加如libc.lib

但是添加之后,出现新的问题:

Linking...
sglDraw.obj : error LNK2001: unresolved external symbol _SGLDRAWFILLEDRECT@16
sglDraw.obj : error LNK2001: unresolved external symbol _SGLCREATEWINDOWS@20
Debug/sglDraw.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

sglDraw.exe - 3 error(s), 0 warning(s)

这不是编译阶段的问题,是连接阶段的问题。
报错的意思是找不到那两个函数。
或者提供那两个函数的源代码,或者提供连接的静态库(.lib文件),或者提供去他类型的接口。

这个问题目前还没有得到很好的解决,求高手指点

 

过了好几天, 这个问题我终于找到了,就是把sgl里面include里面的文件全面拷贝到C:Program FilesMicrosoft Visual StudioDF98INCLUDE目录下,把sgl里面lib里面的文件全部拷贝到C:Program FilesMicrosoft Visual StudioDF98LIB

 附件:以下为查找到的相关资料

版本

类 型

使用的library

被忽略的library

Release

单线程

libc.lib

libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

多线程

libcmt.lib

libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

使用DLL的多线程

msvcrt.lib

libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib

 Debug

单线程

libcd.lib

libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib

多线程

libcmtd.lib

libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib

使用DLL的多线程

msvcrtd.lib

libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug版本: 调试阶段使用
     /MT多线程应用程序
     /Mtd多线程应用程序(DEBUG)
     /MD多线程DLL 
     /MDd多线程DLL(DEBUG)

(1)、/MD :

        定义 _MT 和 _DLL 以便同时从标准 .h 文件中选择运行时例程的多线程特定版本和 DLL 特定版本。此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。 
        当在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时,它将导致应用程序使用静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 进行链接,同时仍通过 msvcrt.lib 动态链接到主 CRT。

(2)、/MDd :

       定义 _DEBUG、_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
3)、/ML

        使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。

(4)、/MLd   

         定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。

(5)、/MT 

       定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。创建多线程程序需要 /MT 或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。

(6)、/MTd

       定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。创建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。

(7)、/LD  

      创建 DLL。将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。

(8)、/LDd

      创建调试 DLL。定义 _DEBUG。

警告: 

       不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在 .exe 文件内部既使用静态版本又使用动态版本链接,但您仍可以使用运行时库的两个(或更多)副本。例如,当与用动态 (DLL) 版本的运行时库链接的 .exe 文件一起使用时,用静态(非 DLL)版本的运行时库链接的动态链接库可能导致问题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。

 



https://blog.sciencenet.cn/blog-579160-463114.html

上一篇:fortran 文件操作知识要点摘要
下一篇:确定研究方向GPS气象学
收藏 IP: 159.226.162.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-28 21:12

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部