【问题标题】:how to link with static mySQL C library with Visual Studio 2008?如何将静态 mySQL C 库与 Visual Studio 2008 链接?
【发布时间】:2011-02-20 15:54:28
【问题描述】:

我的项目运行良好,但它需要一些 DLL,这意味着最终用户不能简单地拖放它。与我的可执行文件并排放置时不会加载 DLL,因为我的可执行文件不是应用程序,并且它的位置不在 Windows 查找 DLL 的少数几个位置。我已经问过一个关于如何进行加载的问题。没有任何建议有效(请参阅how can a Win32 App plugin load its DLL in its own directory 的问题)

所以我现在正在探索另一种方法:完全摆脱 DLL,并与它们的静态版本链接。最后一个 DLL 失败了。

所以我现在除了一个库之外的所有库都是静态链接的,一切都很好。最后一个库是用于 mySQL 的标准 C 库,即 Connector/C。我遇到的问题可能与该来源有关,也可能无关。

每当我切换到链接器附加依赖项中的静态库时,我都会收到以下错误(日志在最后):

1- LIBCMT.lib 和 MSVCRT.lib 之间大约有 40 个重复符号(例如_toupper)。有趣的是,我无法控制这两个库的包含:它们来自 Visual Studio 并自动包含在内。那么,当我包含 mySQL 的静态库而不包含它的 DLL 时,为什么这些符号重复?

Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\MSVCRT.lib:  
Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib:  
Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\msvcprt.lib:  
Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\LIBCMT.lib:  
LIBCMT.lib(setlocal.obj) : error LNK2005: _setlocale already defined in MSVCRT.lib(MSVCR90.dll)  

Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\MSVCRT.lib:  
MSVCRT.lib(MSVCR90.dll) : error LNK2005: _toupper already defined in LIBCMT.lib(toupper.obj)  

2-MSVCRTLIBCMTconflicts with use of other libs 的两个警告,以及对use /NODEFAULTLIB:library: 的建议。我不明白这个建议:我应该做什么以及如何做?

LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library  
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library  

3- 未定义外部符号:_main。那么这是否意味着静态 mySQL 库(但不是 DLL)引用了 _main 符号?为此,我尝试在我的代码中定义一个名为_main() 的空函数,没有区别。

LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main  

正如我在第一个问题中提到的,我的代码是完全工作的 Mac 版本代码的移植。它是我无法控制的主机应用程序的插件。该端口目前可以工作,尽管由于那个单独的剩余 DLL 而存在安装问题。作为一名 Mac 程序员,我对 Visual Studio 和 Windows 相当迷失方向,我发现它们令人困惑、设计和记录不佳,并且错误消息很难掌握和采取行动。因此,我将非常感谢您的帮助。

这是完整的错误集:

1> 搜索 C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\MSVCRT.lib:
1> 搜索 C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib:
1> 搜索 C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\msvcprt.lib:
1> 搜索 C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\LIBCMT.lib:
1>LIBCMT.lib(setlocal.obj) : 错误 LNK2005: _setlocale 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(tidtable.obj) : 错误 LNK2005: __encode_pointer 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(tidtable.obj) : 错误 LNK2005: __encoded_null 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(tidtable.obj) : 错误 LNK2005: __decode_pointer 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(tolower.obj) : 错误 LNK2005: _tolower 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(invarg.obj) : 错误 LNK2005: __set_invalid_parameter_handler 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(invarg.obj) : 错误 LNK2005: __invalid_parameter_noinfo 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(crt0dat.obj) : 错误 LNK2005: __amsg_exit 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(crt0dat.obj) : 错误 LNK2005: __initterm_e 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(crt0dat.obj) : 错误 LNK2005: _exit 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(crtheap.obj) : 错误 LNK2005: __malloc_crt 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(dosmap.obj) : 错误 LNK2005: __errno 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(_file.obj) : 错误 LNK2005: ___iob_func 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(mlock.obj) : 错误 LNK2005: __unlock 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(mlock.obj) : 错误 LNK2005: __lock 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(winxfltr.obj) : 错误 LNK2005: ___CppXcptFilter 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(crt0init.obj) : 错误 LNK2005: ___xi_a 已在 MSVCRT.lib(cinitexe.obj) 中定义
1>LIBCMT.lib(crt0init.obj) : 错误 LNK2005: ___xi_z 已在 MSVCRT.lib(cinitexe.obj) 中定义
1>LIBCMT.lib(crt0init.obj) : 错误 LNK2005: ___xc_a 已在 MSVCRT.lib(cinitexe.obj) 中定义
1>LIBCMT.lib(crt0init.obj) : 错误 LNK2005: ___xc_z 已在 MSVCRT.lib(cinitexe.obj) 中定义
1>LIBCMT.lib(hooks.obj) : 错误 LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(winsig.obj) : 错误 LNK2005: _signal 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(fflush.obj) : 错误 LNK2005: _fflush 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(tzset.obj) : 错误 LNK2005: __tzset 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(_ctype.obj) : 错误 LNK2005: _isspace 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(_ctype.obj) : 错误 LNK2005: _iscntrl 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(getenv.obj) : 错误 LNK2005: _getenv 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(strnicmp.obj) : 错误 LNK2005: __strnicmp 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(osfinfo.obj) : 错误 LNK2005: __get_osfhandle 已在 MSVCRT.lib(MSVCR90.dll) 中定义
1>LIBCMT.lib(osfinfo.obj) : 错误 LNK2005: __open_osfhandle 已在 MSVCRT.lib(MSVCR90.dll) 中定义
[...]
1> 搜索 C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\MSVCRT.lib:
1>MSVCRT.lib(MSVCR90.dll) : 错误 LNK2005: _toupper 已在 LIBCMT.lib(toupper.obj) 中定义
1>MSVCRT.lib(MSVCR90.dll) : 错误 LNK2005: _isalpha 已在 LIBCMT.lib(_ctype.obj) 中定义
1>MSVCRT.lib(MSVCR90.dll) : 错误 LNK2005: _wcschr 已在 LIBCMT.lib(wcschr.obj) 中定义
1>MSVCRT.lib(MSVCR90.dll) : 错误 LNK2005: _isdigit 已在 LIBCMT.lib(_ctype.obj) 中定义
1>MSVCRT.lib(MSVCR90.dll) : 错误 LNK2005: _islower 已在 LIBCMT.lib(_ctype.obj) 中定义
1>MSVCRT.lib(MSVCR90.dll) : 错误 LNK2005: ___doserrno 已在 LIBCMT.lib(dosmap.obj) 中定义
1>MSVCRT.lib(MSVCR90.dll) : 错误 LNK2005: _strftime 已在 LIBCMT.lib(strftime.obj) 中定义
1>MSVCRT.lib(MSVCR90.dll) : 错误 LNK2005: _isupper 已在 LIBCMT.lib(_ctype.obj) 中定义
[...]
1>完成搜索库
1> 创建库 z:\PCdev\Test\RK_Demo_2004\plugins\Test.bundle\contents\windows\Test.lib 和对象 z:\PCdev\Test\RK_Demo_2004\plugins\Test.bundle\contents\windows\Test.exp
1>搜索库
[...]
1>完成搜索库
1>LINK : 警告 LNK4098: defaultlib 'MSVCRT' 与其他库的使用冲突;使用 /NODEFAULTLIB:library
1>LINK : 警告 LNK4098: defaultlib 'LIBCMT' 与其他库的使用冲突;使用 /NODEFAULTLIB:library
1>LIBCMT.lib(crt0.obj) : 错误 LNK2001: 无法解析的外部符号 _main

【问题讨论】:

    标签: visual-studio-2008 linker


    【解决方案1】:

    好吧,写下我的问题让我找到了解决方案。

    关键是这两行:

    LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library  
    LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library  
    

    我在项目属性的链接器部分的输入部分找到了“忽略特定库”。在那里添加LIBCMT,只有那个,修复了所有问题。

    为什么?不知道。 _main 符号怎么了?难倒我了。但它有效。

    【讨论】:

      【解决方案2】:

      实际上,我在 Mac 中发现了很多更有意义的东西,我猜微软只是想与众不同;) VS 总体上是一个很好的 IDE,具有调试器和 Intellisense 功能,我什至发现它比 XCode 更胜一筹。

      您可以在(项目属性->配置属性->)链接器->高级->入口点中设置主入口 问候

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 2021-05-11
        • 1970-01-01
        相关资源
        最近更新 更多