2010-04-06 98 views
1

我正在尝试使用LLVM编译c程序,并且遇到了一些包含静态库的问题。我已经使用LLVM成功编译了这些静态库,例如,libogg.a也存在,就像ogg.l.bc一样。不包含在生成的LLVM可执行文件中的静态库

但是,当我尝试构建最终的程序时,它不包含静态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

我不认为-loption预期路径。你应该分裂出来的那些,并使用-L选项设置的路径,然后只使用普通的库名与-l

$ gcc oggvorbis.c -O3 -Wall -I$OV_DIR/include -L$OV_DIR/lib -logg -lvorbis -o test.exe 

另外请注意,这样在使用时,你不包括“LIB”和库名称的“.a”部分。

+0

感谢您的答复。您可以使用带-l选项的路径。这迫使编译器使用指定的文件而不是扩展-logg。这是因为编译器比静态库更喜欢动态共享库。 无论哪种方式,它都不能解释即使它们存在也无法找到字节码l.bc文件的事实! – 2010-04-06 09:56:00

3

正如展开说的那样, -l后面跟着库名。

例如,在linux库命名惯例, 如果库命名为libogg,

-logg会发现,选择在图书馆目录中的*最佳匹配。

您可以添加目录到列表:

  1. -l选项的以下临时文件夹添加到列表的方式之一。
  2. 环境变量LD_LIBRARY_PATH还会影响GNU工具在大多数Linux/Unix上的列表。

gcc可能会找到名称与请求的库名相匹配的静态库和共享库文件。

例如,

libogg.a libogg。所以

这就是为什么有一个gcc的选项,-static

-static
在支持动态链接系统,这样可以防止连接 与共享库。在其他 系统上,此选项不起作用。

如果你只是想使用共享或静态库文件 - 直接,只是作为一个目标文件,然后 给自己的路,没有任何选项,如

gcc oggvorbis.c the_path/libogg.a 
+0

您可能想要阅读gcc的手册页-l选项 – ddoman 2010-04-06 10:27:34

+0

感谢您的回复。我将尝试直接将静态库文件用作对象文件。 – 2010-04-06 11:30:20

相关问题