我想学习如何制作和使用静态库,但遇到了一些问题。这就是我所做的。
首先,我编写了一些代码并将其放入 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 编译该库。 (如果你愿意,你也可以将库的代码放在头文件中,但听起来你正在尝试拥有一个已经编译的静态库。)
关于c++ - 链接 C++ 代码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16619335/