||
我用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 |
(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)版本的运行时库链接的动态链接库可能导致问题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-28 21:12
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社