QT中编译时出现的undefined reference to ''

时间:2022-11-21 05:30:18
这是我QT .pro里面加的
  LIBS += -L../ffmpeg/lib/libavcodec.dll.a

我想要调用该库中的avcodec_register_all();函数
  于是就出现 错误:undefined reference to `avcodec_register_all'
                 :-1: 错误:collect2: ld returned 1 exit status

出现该错误,很明显是在编译的时候,该函数没有找到定义。也就是说没有找到该库。
可是我在.pro中加了LIBS += -L../ffmpeg/lib/libavcodec.dll.a。不知道是什么原因造成的。

14 个解决方案

#1


格式是这样
LIBS += -lxxlib


#2


引用 1 楼  的回复:
格式是这样
LIBS += -lxxlib

那我应该是这样写?
LIBS += -l../ffmpeg/lib/libavcodec.dll.a

#3


格式错了

直接写

LIBS += ../ffmpeg/lib/libavcodec.dll.a


就行了(如果你路径没错的话)

因为你这个是绝对路径

#4


那什么情况下加-L呢?
引用 3 楼  的回复:
格式错了

直接写

LIBS += ../ffmpeg/lib/libavcodec.dll.a


就行了(如果你路径没错的话)

因为你这个是绝对路径

#5


用简称时 使用-L指定简称所在的路径

比如-L../ffmpeg/lib -lavcodec

#6


这个是.lib的这样写可以喔,.dll.a就不行了吧。我感觉是这样的
引用 5 楼  的回复:
用简称时 使用-L指定简称所在的路径

比如-L../ffmpeg/lib -lavcodec

#7


你的感觉是错误的

另外如果在windows上的gcc,-l只会搜索.a和.dll.a结尾的,如果有多个同名,那么以.dll.a的为优先

.lib是不可能去搜索的

#8


呃,述说我再vs下面调用的经验。
首先ffmpeg的头文件需要这样包含,不然确实会找不到定义
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/mem.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/eval.h>
#include <libavutil/parseutils.h>
#include <libavfilter/avfilter.h>
#include <libavutil/opt.h>
};
另外我的环境是将QT集成进了VS,不需考虑.pro怎么写。

#9


gcc -I -L -l区别

我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:

例:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld

上面这句表示在编译hello.c时:


-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include

-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib

 -lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)

#10


引用 8 楼  的回复:
呃,述说我再vs下面调用的经验。
首先ffmpeg的头文件需要这样包含,不然确实会找不到定义
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/mem.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#inclu……

我正在使用ffmpeg,不过遇到了些,莫名的奇怪问题!能不能分享一下你的使用?
下面是我的部分代码(在调用这个API: avcodec_register_all())出现一个问题
#include <iostream>
using namespace std;

extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/mem.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/eval.h>
#include <libavutil/parseutils.h>
#include <libavfilter/avfilter.h>
#include <libavutil/opt.h>
}

FILE*   wfd;
int main ( int argc, char **argv )
{

    //////////////////////////for init decoder
    AVCodec*        codec;
    AVCodecContext* c= NULL;
    AVFrame*        picture;
    AVPacket        avpkt;

    /////////////////////////test decode_h264()
    FILE* rfd;
    char* temp_p     = 0;
    char* decode_p   = 0;
    int   get_frame  = 0;
    int   frame_len  = 0;

    //////////write file

//    wfd = fopen("xxxxx.yuv", "wb");
//    if (!wfd)
//    {
//        fprintf(stderr, "could not open %s\n", "xxxxx.yuv");
//        return -1;
//    }

    //avcodec_init();
    avcodec_open(c,codec);
    avcodec_register_all();

    cout << "hello word!!!" << endl;

    system("pause");


return 0;
}

这是在QT下面用MinGw编译运行时出现的问题:druing startup program exit with code 0xC0000135.

在VS中编译时:libavutil\common.h(31): fatal error C1083: 无法打开包括文件:“inttypes.h”: No such file or directory

#11


楼主 在调用库完成以后,请导出库里面的函数,或者说是,声明一下。

#12


问题已经解决了!谢谢各位

#13


你好我在用QT的.pro中包括了:
LIBS += -L  -lavcodec -lavformat -lswscale -lavutil
LIBS += -L "C:\msys\1.0\local\lib\libavcodec.a"
LIBS += -L "C:\msys\1.0\local\lib\libavformat.a"
LIBS += -L "C:\msys\1.0\local\lib\libswscale.a"

INCLUDEPATH += "C:\msys\1.0\local\include\libavcodec"
INCLUDEPATH += "C:\msys\1.0\local\include\libavformat"
INCLUDEPATH += "C:\msys\1.0\local\include\libswscale"
INCLUDEPATH += "C:\msys\1.0\local\include\libavutil"

在.cpp中包括了:
extern "C"
{
    #include "libavcodec\avcodec.h"
    #include "libavformat\avformat.h"
    #include "libswscale\swscale.h"
    #include "libavutil\avutil.h"
};

但是编译时出错:
..\ffmpeg\/ffmpegdecoder.h:8:36: error: libavcodec\avcodec.h: No such file or directory

..\ffmpeg\/ffmpegdecoder.h:9:38: error: libavformat\avformat.h: No such file or directory

..\ffmpeg\/ffmpegdecoder.h:10:36: error: libswscale\swscale.h: No such file or directory

..\ffmpeg\/ffmpegdecoder.h:11:34: error: libavutil\avutil.h: No such file or directory

请问该怎么解决!

#14


工程文件中的INCLUDEPATH变量与源文件中#include后的内容组合起来应该是一个完整的路径,显然你的绝对路径是不对的,以下是正确的:
INCLUDEPATH += "C:\msys\1.0\local\include"

#1


格式是这样
LIBS += -lxxlib


#2


引用 1 楼  的回复:
格式是这样
LIBS += -lxxlib

那我应该是这样写?
LIBS += -l../ffmpeg/lib/libavcodec.dll.a

#3


格式错了

直接写

LIBS += ../ffmpeg/lib/libavcodec.dll.a


就行了(如果你路径没错的话)

因为你这个是绝对路径

#4


那什么情况下加-L呢?
引用 3 楼  的回复:
格式错了

直接写

LIBS += ../ffmpeg/lib/libavcodec.dll.a


就行了(如果你路径没错的话)

因为你这个是绝对路径

#5


用简称时 使用-L指定简称所在的路径

比如-L../ffmpeg/lib -lavcodec

#6


这个是.lib的这样写可以喔,.dll.a就不行了吧。我感觉是这样的
引用 5 楼  的回复:
用简称时 使用-L指定简称所在的路径

比如-L../ffmpeg/lib -lavcodec

#7


你的感觉是错误的

另外如果在windows上的gcc,-l只会搜索.a和.dll.a结尾的,如果有多个同名,那么以.dll.a的为优先

.lib是不可能去搜索的

#8


呃,述说我再vs下面调用的经验。
首先ffmpeg的头文件需要这样包含,不然确实会找不到定义
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/mem.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/eval.h>
#include <libavutil/parseutils.h>
#include <libavfilter/avfilter.h>
#include <libavutil/opt.h>
};
另外我的环境是将QT集成进了VS,不需考虑.pro怎么写。

#9


gcc -I -L -l区别

我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:

例:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld

上面这句表示在编译hello.c时:


-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include

-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib

 -lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)

#10


引用 8 楼  的回复:
呃,述说我再vs下面调用的经验。
首先ffmpeg的头文件需要这样包含,不然确实会找不到定义
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/mem.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#inclu……

我正在使用ffmpeg,不过遇到了些,莫名的奇怪问题!能不能分享一下你的使用?
下面是我的部分代码(在调用这个API: avcodec_register_all())出现一个问题
#include <iostream>
using namespace std;

extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/mem.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/eval.h>
#include <libavutil/parseutils.h>
#include <libavfilter/avfilter.h>
#include <libavutil/opt.h>
}

FILE*   wfd;
int main ( int argc, char **argv )
{

    //////////////////////////for init decoder
    AVCodec*        codec;
    AVCodecContext* c= NULL;
    AVFrame*        picture;
    AVPacket        avpkt;

    /////////////////////////test decode_h264()
    FILE* rfd;
    char* temp_p     = 0;
    char* decode_p   = 0;
    int   get_frame  = 0;
    int   frame_len  = 0;

    //////////write file

//    wfd = fopen("xxxxx.yuv", "wb");
//    if (!wfd)
//    {
//        fprintf(stderr, "could not open %s\n", "xxxxx.yuv");
//        return -1;
//    }

    //avcodec_init();
    avcodec_open(c,codec);
    avcodec_register_all();

    cout << "hello word!!!" << endl;

    system("pause");


return 0;
}

这是在QT下面用MinGw编译运行时出现的问题:druing startup program exit with code 0xC0000135.

在VS中编译时:libavutil\common.h(31): fatal error C1083: 无法打开包括文件:“inttypes.h”: No such file or directory

#11


楼主 在调用库完成以后,请导出库里面的函数,或者说是,声明一下。

#12


问题已经解决了!谢谢各位

#13


你好我在用QT的.pro中包括了:
LIBS += -L  -lavcodec -lavformat -lswscale -lavutil
LIBS += -L "C:\msys\1.0\local\lib\libavcodec.a"
LIBS += -L "C:\msys\1.0\local\lib\libavformat.a"
LIBS += -L "C:\msys\1.0\local\lib\libswscale.a"

INCLUDEPATH += "C:\msys\1.0\local\include\libavcodec"
INCLUDEPATH += "C:\msys\1.0\local\include\libavformat"
INCLUDEPATH += "C:\msys\1.0\local\include\libswscale"
INCLUDEPATH += "C:\msys\1.0\local\include\libavutil"

在.cpp中包括了:
extern "C"
{
    #include "libavcodec\avcodec.h"
    #include "libavformat\avformat.h"
    #include "libswscale\swscale.h"
    #include "libavutil\avutil.h"
};

但是编译时出错:
..\ffmpeg\/ffmpegdecoder.h:8:36: error: libavcodec\avcodec.h: No such file or directory

..\ffmpeg\/ffmpegdecoder.h:9:38: error: libavformat\avformat.h: No such file or directory

..\ffmpeg\/ffmpegdecoder.h:10:36: error: libswscale\swscale.h: No such file or directory

..\ffmpeg\/ffmpegdecoder.h:11:34: error: libavutil\avutil.h: No such file or directory

请问该怎么解决!

#14


工程文件中的INCLUDEPATH变量与源文件中#include后的内容组合起来应该是一个完整的路径,显然你的绝对路径是不对的,以下是正确的:
INCLUDEPATH += "C:\msys\1.0\local\include"