c - 编译C时如何链接文件夹中的所有目标文件?

标签 c ffmpeg compilation linker

所以我有两个文件夹:

/ffmpeg
/myproj

在 myproj 中我有一个主要方法:

#include <stdio.h>
#include <stdlib.h>
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"

int main(int argc, char *argv[])
{
    AVFormatContext *pFormatCtx = NULL;

    if (avformat_open_input(&pFormatCtx, argv[1], NULL, 0) != 0)
        return -1;

    return EXIT_SUCCESS;
}

我正在尝试像这样编译这个文件:

cc main.c -I../ffmpeg ../ffmpeg/libavformat/utils.o

并且收到此错误:

"_ffio_set_buf_size", referenced from:
_ff_configure_buffers_for_index in utils.o
ld: symbol(s) not found for architecture x86_64

我明白它的意思 - 我需要包含 utils.o 的依赖项,存储在文件 utils.d 中。但我该如何在命令行上执行此操作呢?有大量、大量、大量的依赖项,我知道人们不会手动输入这些!

最佳答案

你的方向错了,你应该链接到共享库(libav)。 将这些行添加到您的 Makefile (并根据您的设置修复路径):

LIBAV_PATH = /path/to/ffmpeg/lib/pkgconfig/
PKG_DEPS = libavformat libswscale libswresample libavutil libavcodec

CFLAGS  = `PKG_CONFIG_PATH=$(LIBAV_PATH) pkg-config --cflags $(PKG_DEPS)`
LDFLAGS = `PKG_CONFIG_PATH=$(LIBAV_PATH) pkg-config --libs $(PKG_DEPS)`

PKG_DEPS中,我包含了许多库,您可能不需要所有这些库,请删除那些不必要的库(但稍后再做 - 首先按原样尝试)。

你的 all: 行应该是这样的:

all: main.c
        @gcc -I$(INCLUDE) main.c -o test.out $(CFLAGS) $(LDFLAGS)

关于c - 编译C时如何链接文件夹中的所有目标文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52451068/

相关文章:

compilation - : run compiled elixir binary in iex console

c - 我怎么知道 gcc 是否同意某些东西是易变的?

c - C中system()的返回值

c - 异步启动 ffmpeg.exe?

ffmpeg - 如何在不重新编码的情况下使用 ffmpeg 删除帧?

opencv - Linux上的OpenCV编译:如何向其提供特定的zlib lib?

c++ - 在 C++、Windows 7 中包含 OpenGL 库

c - 获取字符数组的长度

c - RGB888(24位)转PNG/JPEG图像算法

FFMPEG:使用过滤器添加透明水印