我想学习如何制作和使用静态库,我遇到了一些问题。这就是我所做的。
首先,我编写了一些代码,并将其放入String.h
和String.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项目中。我已经:
添加了String.h
到Project - C/C++ -General - Additional Include Directories
的路径
将String.h
包含在某个项目标题中
添加了String.lib
到Project - Linker - General - Additional library directories
的路径
将String.lib
添加到Project - Linker - Input - Additional dependencies
在我尝试构建项目的所有这些步骤之后,链接器给了我许多LNK2011
和LNK2019
错误。在我看来,它无法找到我的功能的实现......
请告诉我我做错了什么,我该怎么办呢。谢谢!
答案 0 :(得分:1)
C ++没有太多关于二进制格式的标准 - 甚至没有关于如何在库中记录名称的标准。 (C ++编译器喜欢“破坏”名称,将参数和返回类型代码插入其中。但他们并不完全同意如何这样做。)结果是,来自一个库编译器很少可以移植到另一个编译器,除非它们中的函数声明为extern "C"
。
您必须要么声明您的库函数,要么使用Visual Studio编译库,如果您想要使用它。 (如果需要,您也可以将库的代码放在头文件中,但听起来您正在尝试使用已编译的静态库。)