如何在automake中链接libavcodec,libavformat?

 坐在河边的蚂蚁 发布于 2023-01-04 10:31

我在C++项目中使用来自ffmpeg的libavcodec和libavformat库.链接-lavcodec -lavformat与g ++编译器工作正常,但是当我尝试使用在automake项目中编译的相同代码时,我不确定出了什么问题.

工作正常:

g++ -o test -D__STDC_CONSTANT_MACROS -lavcodec -lavformat test.cpp

不工作Makefile.am:

binaryname_LDFLAGS= -lavcodec -lavformat

错误:

....
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function 
ff_nut_add_sp: error: undefined reference to 'av_tree_node_size'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function 
ff_nut_add_sp: error: undefined reference to 'av_tree_insert'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function 
ff_nut_free_sp: error: undefined reference to 'av_tree_enumerate'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(nut.o):function 
ff_nut_free_sp: error: undefined reference to 'av_tree_destroy'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libavformat.a(rtp.o):function 
ff_rtp_get_payload_type: error: undefined reference to 'av_opt_get_int'
...

也没工作:

LDFLAGS=...-lavcodec -lavformat

错误:

src/dsp/audioDecoder.cpp:99: error: undefined reference to 'av_register_all'
src/dsp/audioDecoder.cpp:101: error: undefined reference to 'avcodec_find_decoder'
src/dsp/audioDecoder.cpp:109: error: undefined reference to 'avcodec_alloc_context'
src/dsp/audioDecoder.cpp:120: error: undefined reference to 'avcodec_open2'
src/dsp/audioDecoder.cpp:125: error: undefined reference to 'av_init_packet'
src/dsp/audioDecoder.cpp:188: error: undefined reference to 'avcodec_decode_audio3'

在第二种情况下,如果我没有设置任何链接器,则无法找到包含头,因此链接器似乎以某种方式被识别.

使V = 1返回:

make  all-am
make[1]: Go to '/path/to/trunk'
/bin/bash ./libtool --tag=CXX   --mode=link g++  -O2 -lrt -D__STDC_CONSTANT_MACROS   -o binaryname progsrc/binaryname/binaryname-binaryname.o    -lm  -lpthread -ldl -lmygeneratedlibrary
libtool: link: g++ -O2 -D__STDC_CONSTANT_MACROS -o binaryname progsrc/binaryname/binaryname-binaryname.o  -lm /path/to//trunk/.libs/lmygeneratedlibrary.a -lrt -lavutil -lavcodec -lavformat -lpthread -ldl
make[1]: Leave '/path/to/trunk'

我在这做错了什么?

1 个回答
  • CPPFLAGS是为了C P re - Pocessor.不是C++标志.那是CXXFLAGS.对于链接器的东西,你想要的LDFLAGS.

    您的Makefile.am似乎不遵循规范的Makefile.am格式.你可能想要它更像(取自这里):

    # what flags you want to pass to the C compiler & linker
    CFLAGS = # C compiler flags
    LDFLAGS = # Linker flags
    
    # this lists the binaries to produce, the (non-PHONY, binary) targets in
    # the previous manual Makefile
    bin_PROGRAMS = targetbinary1 targetbinary2 [...] targetbinaryN
    targetbinary1_SOURCES = targetbinary1.c myheader.h [...]
    targetbinary2_SOURCES = targetbinary2.c
    .
    .
    targetbinaryN_SOURCES = targetbinaryN.c
    

    此外,请确保在包含FFmpeg的标题时,用它们包围它们extern "C".例如:

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

    2023-01-04 10:32 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有