我正在尝试使用LLVM编译c程序,但我无法获得包含的静态库。我已经使用LLVM成功编译了这些静态库,例如,存在libogg.a,就像ogg.l.bc一样。
但是,当我尝试构建最终程序时,它不包含静态ogg库。我已经尝试了各种编译器选项,最值得注意的是:
gcc oggvorbis.c -O3 -Wall -I$OV_DIR/include -l$OV_DIR/lib/libogg.a -l$OV_DIR/lib/libvorbis.a -o test.exe
这导致以下输出(为简洁而缩短目录):
$OV_DIR/include/vorbis/vorbisfile.h:75: warning: ‘OV_CALLBACKS_DEFAULT’ defined but not used
$OV_DIR/include/vorbis/vorbisfile.h:82: warning: ‘OV_CALLBACKS_NOCLOSE’ defined but not used
$OV_DIR/include/vorbis/vorbisfile.h:89: warning: ‘OV_CALLBACKS_STREAMONLY’ defined but not used
$OV_DIR/include/vorbis/vorbisfile.h:96: warning: ‘OV_CALLBACKS_STREAMONLY_NOCLOSE’ defined but not used
llvm-ld: warning: Cannot find library '$OV_DIR/lib/ogg.l.bc'
llvm-ld: warning: Cannot find library '$OV_DIR/lib/vorbis.l.bc'
WARNING: While resolving call to function 'main' arguments were dropped!
我发现这很令人困惑,因为$ OV_DIR / lib / ogg.l.bc和vorbis.l.bc一样存在,并且每个人都可以读取它们(包含它们的目录)。
有没有人知道我做错了什么?
谢谢,
马特
答案 0 :(得分:3)
放松说, -l后跟库名。
例如,在linux库命名约定中, 如果库名为libogg,
-logg将在库目录中找到并选择*最佳匹配。
您可以在列表中添加目录:
- -L选项是临时将以下文件夹添加到列表中的方法之一。
- 环境变量LD_LIBRARY_PATH也影响大多数Linux / Unix上的列表>使用GNU工具。
醇>
gcc可能会找到名称与请求的库名称匹配的静态和共享库文件。
例如,
libogg.a libogg.so
这就是为什么有一个gcc选项,-static
-static
在支持动态链接的系统上,这会阻止链接 使用共享库。在其他方面 系统,此选项无效。
如果您只想使用共享或静态库文件 - 直接使用,就像目标文件一样, 然后在没有任何选择的情况下给出他们的路径,比如
gcc oggvorbis.c the_path/libogg.a
答案 1 :(得分:0)
我认为-l
option不期望路径。您应该将它们拆分出来,并使用-L
选项设置路径,然后只使用普通库名称-l
:
$ gcc oggvorbis.c -O3 -Wall -I$OV_DIR/include -L$OV_DIR/lib -logg -lvorbis -o test.exe
另请注意,如果像这样使用,则不包含库名称的“lib”和“.a”部分。