我试图编译一个不相关的项目,当我使用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
从这一点上,我推测,该符号实际上是存在于我所链接的图书馆,因此我的问题。为什么我的编译器(gcc
和clang
)报告了对GetRenderWidth()
的未定义引用,而不是对同一库中的其他符号的未定义引用?
1条答案
按热度按时间cigdeys31#
原来
/usr/local/lib
也包含了我的编译器链接的同一个库的共享版本。这个版本没有包含GetRenderWidth
符号,这是造成我困惑的原因。我可以通过将-l:libraylib.a
替换为-lraylib
来强制编译器使用静态库。