【问题标题】:Problems with linking C++ code链接 C++ 代码的问题
【发布时间】:2013-05-17 23:48:41
【问题描述】:

我正在学习如何制作和使用静态库,但遇到了一些问题。这就是我所做的。

首先我编写了一些代码并放入String.hString.cpp 文件中。

然后我把它编译成一个目标文件:

mingw32-g++ -c -O2 -s -DNDEBUG String.cpp -o .\obj\String.o

然后我已经存档(?)它:

ar cr .\lib\String.lib .\obj\String.o

并索引(?)它:

ranlib .\lib\String.lib

之后,我已经成功编译并使用 mingw 链接测试:

mingw32-g++ -std=c++03 -Wall -O2 -s -DNDEBUG .\test\src\test.cpp .\lib\String.lib -o .\test\bin\test.exe

测试编译、链接并完美运行。

之后我想将此库包含到我的 MSVS12 项目中。我已经:

  1. String.h的路径添加到Project - C/C++ -General - Additional Include Directories

  2. 在某些项目标题中包含String.h

  3. String.lib的路径添加到Project - Linker - General - Additional library directories

  4. String.lib 添加到Project - Linker - Input - Additional dependencies

在我尝试构建项目的所有这些步骤之后,链接器给了我许多LNK2011LNK2019 错误。在我看来,它找不到我的功能的实现......

请告诉我我做错了什么以及如何解决它。谢谢!

【问题讨论】:

    标签: c++ compiler-construction linker static-libraries linker-errors


    【解决方案1】:

    C++ 没有太多关于二进制格式的标准——甚至没有名称在库中的记录方式。 (C++ 编译器喜欢“修改”名称,在其中插入参数类型和返回类型代码之类的东西。但他们并不完全同意 如何 这样做。)结果是,来自一个的库编译器很少可移植到另一个编译器,除非其中的函数声明为 extern "C"

    您必须声明您的库函数,或者使用 Visual Studio 编译库(如果您想在其中使用它)。 (如果需要,您也可以将库的代码放在头文件中,但听起来您正在尝试拥有一个已经编译的静态库。)

    【讨论】:

    • 感谢您的回答!我想做一个通用的跨平台库。 String 只是它的一部分。我为每个模块提供了一个 makefile 和测试。这样任何人都可以在它的机器上构建它。因此,如果我想将它与 MSVS 一起使用,我需要使用一些微软工具(如 NMAKE)来运行我的 makefile?
    • @Kolyunya:一个通用的、跨平台的、编译的库有点像白日梦,原因已经提到过。除非您使用extern "C",否则编译器之间的二进制兼容性很差,即使那样,也有几种不同格式的库。所以,是的,通常有人必须在他们的机器上编译它。 (或者,您可以为他们的编译器提供二进制文件。但是,嗯。)
    • 我的意思是这个库是开源的。我想提供源代码和生成文件,以便任何人都可以在他们的机器上编译它。我做得对吗?谢谢!
    • 现在需要使用nmake 来编译我的lib 以与MSVS 一起使用,我理解了吗?
    • 对于那些不知道如何在 Windows 上从控制台编译 C++ 代码的人,使用 nmake.exe 来读取 makefile,cl.exe 作为编译器,lib.exe 作为归档器。所有这些都位于VisualStudio/VC/bin 文件夹中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2022-01-06
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多