1

我正在尝试使用 LLVM 编译 ac 程序,但在获取一些静态库时遇到了麻烦。我已经使用 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 也存在,而且它们都可以被每个人读取(就像它们包含的目录一样)。

有谁知道我做错了什么?

谢谢,

马特

4

2 回答 2

3

正如 unwind 所说, -l 后跟库名称。

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

-logg 将在库目录中查找并选择 *best match。

您可以将目录添加到列表中:

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

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

例如,

libogg.a libogg.so

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

-static
在支持动态链接的系统上,这会阻止与共享库的链接。在其他系统上,此选项无效。

如果您只想使用共享或静态库文件 - 直接,就像一个目标文件,那么在没有任何选项的情况下给出它们的路径,比如

gcc oggvorbis.c the_path/libogg.a
于 2010-04-06T10:16:08.387 回答
0

我不认为该-l 选项需要路径。您应该将它们分开,并使用该-L选项来设置路径,然后只需使用简单的库名称-l

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

另请注意,当这样使用时,您不包括库名称的“lib”和“.a”部分。

于 2010-04-06T09:41:43.613 回答