Libav链接错误:未定义的引用(Libav linking error: undefined re

2019-07-23 09:06发布

这里是我的问题:

  • 我内置的ffmpeg从源(1.2版),该libav *库在/ usr / local / lib目录,他们是静态
  • 我编译NS3(www.nsnam.org)模块,所以我在连接器只控制是通过环境变量LINKFLAGS
  • 在源集管处于“外部C”块,所以它不是通常的克++名字改编
  • 我设置LINKFLAGS = “ - 我的/ usr /本地/包括/ libavformat流-I在/ usr /本地/包括/ libavcodec的-I在/ usr /本地/包括/ libavutil -L在/ usr / local / lib目录-lavformat -lavcodec -lavutil” ,而且似乎链接器无法找到任何的libav *函数我叫(我得到了很多的“未定义的引用”,然后“collect2:错误:LD返回状态1”

谁能帮我? 谢谢...

编辑:这里有几个未定义的参考信息:

    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_guess_format'
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_read_frame'
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `avformat_write_header'
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_interleaved_write_frame'
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_find_stream_info'
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_register_all'
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_init_packet'
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `avformat_alloc_context'
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_dump_format'
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `avio_close'

EDIT2:这里是“构建失败”后,我得到的消息:

-> task in 'scratch-simulator' failed (exit status 1): 
{task 53952272: cxxprogram scratch-simulator.cc.1.o -> scratch-simulator}
['/usr/bin/g++', '-I/usr/local/include/libavcodec', '-I/usr/local/include/libavformat/',
 '-I/usr/local/include/libavutil/', '-L/usr/local/lib', '-I/usr/local
/include/libavcodec', '-I/usr/local/include/libavformat/', '-I/usr/local/include
/libavutil/', '-L/usr/local/lib', '-pthread', '-pthread', '-Wl,-z,relro', 
'scratch/scratch-simulator.cc.1.o', '-o', '/home/fede/Thesis/ns-allinone-3.14.1
/ns-3.14.1/build/scratch/scratch-simulator', '-Wl,-Bstatic', '-Wl,-Bdynamic', 
'-Wl,--no-as-needed', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.',
 '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.',
 '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', 
'-L.', '-L.', '-L.', '-L.', '-L.', '-L/usr/lib', '-lns3.14.1-test-debug', '-lns3.14.1-
csma-layout-debug', '-lns3.14.1-point-to-point-layout-debug', '-lns3.14.1-netanim-
debug', '-lns3.14.1-lte-debug', '-lns3.14.1-spectrum-debug', '-lns3.14.1-antenna-
debug', '-lns3.14.1-aodv-debug', '-lns3.14.1-dsdv-debug', '-lns3.14.1-dsr-debug', 
'-lns3.14.1-mesh-debug', '-lns3.14.1-olsr-debug', '-lns3.14.1-csma-debug', '-lns3.14.1-
wimax-debug', '-lns3.14.1-applications-debug', '-lns3.14.1-virtual-net-device-debug', 
'-lns3.14.1-uan-debug', '-lns3.14.1-energy-debug', '-lns3.14.1-flow-monitor-debug', 
'-lns3.14.1-nix-vector-routing-debug', '-lns3.14.1-tap-bridge-debug', '-lns3.14.1-
visualizer-debug', '-lns3.14.1-internet-debug', '-lns3.14.1-bridge-debug', '-lns3.14.1-
point-to-point-debug', '-lns3.14.1-mpi-debug', '-lns3.14.1-wifi-debug', '-lns3.14.1-
buildings-debug', '-lns3.14.1-propagation-debug', '-lns3.14.1-mobility-debug', 
'-lns3.14.1-config-store-debug', '-lns3.14.1-tools-debug', '-lns3.14.1-stats-debug',
 '-lns3.14.1-emu-debug', '-lns3.14.1-topology-read-debug', '-lns3.14.1-network-debug', 
'-lns3.14.1-qoe-monitor-debug', '-lns3.14.1-core-debug', '-lrt', '-lgsl', 
'-lgslcblas', '-lm', '-ldl', '-lgtk-x11-2.0', '-lgdk-x11-2.0', '-latk-1.0', 
'-lgio-2.0', '-lpangoft2-1.0', '-lpangocairo-1.0', '-lgdk_pixbuf-2.0', '-lcairo', 
'-lpango-1.0', '-lfreetype', '-lfontconfig', '-lgobject-2.0', '-lglib-2.0', '-lxml2', 
'-lpython2.7']

Answer 1:

这些库C的库头不包括外部的“C”时,为C ++编译。 在C ++源这样做:

extern "C" { 
#include <libavcodec/avcodec.h> 
#include <libavformat/avformat.h>
}

或者,更一般地,对于混合的C和C ++源:

#ifdef __cplusplus
extern "C" {
#endif
#include <libavcodec/avcodec.h> 
#include <libavformat/avformat.h>
#ifdef __cplusplus 
}
#endif

而且你应该罚款。



Answer 2:

我有这个问题av_find_stream_info ,问题是这样的功能被废弃。 问题是我在框中有两个ffmpeg的安装,它是阅读从一个安装头并使用图书馆从不同的安装。

除系统默认的库后,问题解决了。

更新:对于Ubuntu的我做了以下内容:

$ sudo dpkg -r libavcodec53
$ sudo dpkg -r libavformat53
$ sudo dpkg -r libavutil51
$ sudo dpkg -r libswscale2


Answer 3:

在我自己的搜索过这个问题,只是来了。

在WAF建筑系统,你应该使用STLIB和STLIBPATH来表示,而不是使用LINKFLAGS静态库的名称和路径。 请注意,您应该设置STLIB列出静态库的名字没有前缀或扩展使用。

在WScript的文件中添加

conf.env.append_value("STLIBPATH", ["/usr/local/lib"])
conf.env.append_value("STLIB", ["av*,av**"])


文章来源: Libav linking error: undefined references