结果LLVM可执行文件中不包含静态库

时间:2010-04-06 09:37:34

标签: c llvm static-linking

我正在尝试使用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一样存在,并且每个人都可以读取它们(包含它们的目录)。

有没有人知道我做错了什么?

谢谢,

马特

2 个答案:

答案 0 :(得分:3)

放松说, -l后跟库名。

例如,在linux库命名约定中, 如果库名为libogg,

-logg将在库目录中找到并选择*最佳匹配。

您可以在列表中添加目录:

  
      
  1. -L选项是临时将以下文件夹添加到列表中的方法之一。
  2.   
  3. 环境变量LD_LIBRARY_PATH也影响大多数Linux / Unix上的列表>使用GNU工具。
  4.   

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”部分。