C++ c++;带有静态库的未定义引用

C++ c++;带有静态库的未定义引用,c++,static-libraries,C++,Static Libraries,我试图从一个类中创建一个静态库,但是当我试图使用它时,我总是会在任何东西上出现未定义引用的错误。我继续创建对象文件的方式如下 g++ -c myClass.cpp -o myClass.o 然后用塑料袋包装 ar rcs myClass.lib myClass.o 总的来说,我显然缺少一些东西。我打赌这是带有符号的东西。 谢谢你的建议,我知道这很可能是我在阅读一些教程时能发现的东西,如果再为愚蠢的东西烦恼,我很抱歉:) 编辑: myClass.h: class myClass{ pu

我试图从一个类中创建一个静态库,但是当我试图使用它时,我总是会在任何东西上出现未定义引用的错误。我继续创建对象文件的方式如下

g++ -c myClass.cpp -o myClass.o
然后用塑料袋包装

ar rcs myClass.lib myClass.o
总的来说,我显然缺少一些东西。我打赌这是带有符号的东西。 谢谢你的建议,我知道这很可能是我在阅读一些教程时能发现的东西,如果再为愚蠢的东西烦恼,我很抱歉:)

编辑: myClass.h:

class myClass{
    public:
        myClass();
        void function();
};
myClass.cpp:

#include "myClass.h"

myClass::myClass(){}
void myClass::function(){}
使用类的程序:

#include "myClass.h"

int main(){
myClass mc;
mc.function();

return 0;
}
最后我像这样编译它:

g++ -o main.exe -L. -l myClass main.cpp
这是一个典型的错误:

C:\Users\RULERO~1\AppData\Local\Temp/ccwM3vLy.o:main.cpp:(.text+0x31): undefined
 reference to `myClass::myClass()'
C:\Users\RULERO~1\AppData\Local\Temp/ccwM3vLy.o:main.cpp:(.text+0x3c): undefined
 reference to `myClass::function()'
collect2: ld returned 1 exit status
使用:

使用库路径和-l标志充满了问题,但如果必须这样做,请将库重命名为libmylib.a,然后编译为:

g++ -o main.exe main.cpp -L. -lmylib 
另外请注意,出于可移植性的原因,在源文件或输出文件的名称中使用大小写混合格式通常不是一个好主意。

这可能是一个链接顺序问题。当GNU链接器看到库时,它会丢弃它不需要的所有符号。在本例中,您的库显示在.cpp文件之前,因此在编译.cpp文件之前将丢弃该库。这样做:

g++ -o main.exe main.cpp -L. -lmylib


微软链接器不考虑命令行上的库排序。

< P>这应该避免链接错误,并创建.so共享库:

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

另一个可能的原因是:忘记外部“C”

我之所以遇到这个问题,是因为我试图把C++程序和C静态库链接起来。库的头没有
extern“C”
,因此链接器正在寻找一个损坏的函数名,而库实际上有一个未混合的函数名


花了一段时间才弄清楚发生了什么,所以我希望这对其他人有所帮助。

这是链接器如何优化输出代码的问题。 假设我们有一个使用两个库的可执行文件:Lib_ALib_B库A取决于库B Lib_A定义符号:Lib_A1和Lib_A2,Lib_B定义符号Lib_B1和Lib_B2。 现在让我们假设可执行文件只使用符号Lib_A1,而Lib_A1使用符号Lib_B1,该符号在Lib_B中定义。符号Lib_B1从未在可执行文件中使用

  • 在windows中,链接器是这样工作的:我有两个可执行文件,其中使用了一些lib和可执行文件中使用的所有符号,所有lib都是lib_A1和lib_B1。因此,我需要这两个符号,其余的都是多余的。我将取消定义lib_A2和lib_B2
  • 对于linux,如果您在libu A之前链接libu B,如下所示:
    g++-lLib_B-lLib_A
    链接器是这样工作的:我有一个可执行文件,它首先链接Lib\u B。我看不到可执行文件使用符号Lib_B1或Lib_B2。它们是不必要的,因此我将取消它们的定义。稍后链接器将看到。哦,我还有另一个图书馆。我可以看到可执行文件使用符号Lib_B1。我将保留它并取消定义未使用的符号Lib_B2。它没有看到Lib_B1使用Lib_A1,这已经是未定义的
  • 对于linux,如果您在Lib_B之前链接Lib_A,如下所示:
    g++-lLib_A-lLib_B
    链接器是这样工作的:我有一个可执行文件,它首先链接Lib\u A。哦,我可以看到可执行文件使用Lib_A1。我将保留它们并取消Lib_A2的定义。后来就可以看到了。哦,我还有一个图书馆。我可以看到,现在已链接符号的可执行文件使用Lib_B1,我将保留它们。因此,它保留Lib_B1和Lib_A1,以及未定义的Lib_B2和Lib_A2

  • 是的,我听说了图书馆的推荐名称。。但我已经发现,如果无法链接库,则错误看起来会有所不同。。所以我想说这不是本案的解决方案。你不必迟疑地叫我笨蛋(白痴)我总是忘记了链接顺序与g++的关系——每次:-(不要。这会吸引所有类型的开发人员。我可能花了一个星期的时间在一个大型项目中试图找出奇怪的链接器问题,结果就是这个问题。你是我今天的英雄!)我花了一个小时坐在一个未定义的引用链接器错误前,发现这是一个简单的错误。非常感谢:)非常感谢,刚刚遇到这个线程有同样的问题,它几乎解决了我的问题!:)即使在linux下的cmake框架中,看来目标链接库()中的顺序也很重要。非常感谢您为我节省了很多时间的提示!即使在2015年下半年,这仍然是高度相关的!这会不会将问题转移到运行时?谢谢,这节省了我很多时间
    g++ -o main.exe main.cpp myClass.lib
    
    LOCAL_ALLOW_UNDEFINED_SYMBOLS := true