链接C ++代码的问题

时间:2013-05-17 23:48:41

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

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

首先,我编写了一些代码,并将其放入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.hProject - C/C++ -General - Additional Include Directories的路径

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

  3. 添加了String.libProject - Linker - General - Additional library directories的路径

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

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

    请告诉我我做错了什么,我该怎么办呢。谢谢!

1 个答案:

答案 0 :(得分:1)

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

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