C语言 为什么我会得到一个未定义的引用,指向一个在我链接的库中定义的符号?

gzszwxb4  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(119)

我试图编译一个不相关的项目,当我使用Raylib库的一个特定函数时,我得到了一个未定义的引用。
我能够使用以下测试重现这种行为。c

#include <raylib.h>

int main(){
        InitWindow(500,500, "test");
        
        int w = GetRenderWidth(); // undefined reference symbol
                                                                                
        while(!WindowShouldClose()){                                            
                BeginDrawing();                                                 
                ClearBackground(BLACK);                                  
                EndDrawing();                                                   
        }                                                                       
        CloseWindow();                                                          
        return 0;                                                               
}

此代码是使用以下命令编译的。

gcc test.c -o app -L/usr/local/lib -lraylib

由此产生的产出是

/usr/bin/ld: /tmp/ccxqgamX.o: in function `main':
code.c:(.text+0x27): undefined reference to `GetRenderWidth'
collect2: error: ld returned 1 exit status

有一次我评论了冒犯行,但是(// int w = GetRenderWidth();)应用程序编译良好,也能够成功运行。
我检查了/usr/local/lib文件夹中的libraylib.a库,

nm /usr/local/lib/libraylib.a | grep GetRenderWidth

结果如下:

0000000000027b1e T GetRenderWidth

从这一点上,我推测,该符号实际上是存在于我所链接的图书馆,因此我的问题。为什么我的编译器(gccclang)报告了对GetRenderWidth()的未定义引用,而不是对同一库中的其他符号的未定义引用?

cigdeys3

cigdeys31#

原来/usr/local/lib也包含了我的编译器链接的同一个库的共享版本。这个版本没有包含GetRenderWidth符号,这是造成我困惑的原因。我可以通过将-l:libraylib.a替换为-lraylib来强制编译器使用静态库。

相关问题