我正在学习如何制作和使用静态库,但我遇到了一些问题。这就是我所做的。
首先,我编写了一些代码并放入
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
错误。在我看来,它找不到我的功能的实现...
请告诉我我做错了什么以及如何解决它。谢谢!
C++ 没有太多关于二进制格式的标准——甚至没有在库中记录名称的标准。 (C++ 编译器喜欢“破坏”名称,在其中插入参数和返回类型代码之类的内容。但他们对于“如何”做到这一点并没有达成一致。)结果是,来自一个编译器的库很少可以移植到另一个编译器,除非其中的函数声明为 extern "C"
。
您必须这样声明您的库函数,或者使用 Visual Studio 编译该库(如果您想在其中使用它)。 (如果需要,您也可以将库的代码放入头文件中,但这听起来像是您正在尝试拥有一个已编译的静态库。)