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

时间:2018-09-21 21:05:57

标签: 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文件中。但是,如何在命令行上执行此操作?有很多吨的依赖关系,我知道人们不会手动输入这些信息!

3 个答案:

答案 0 :(得分:1)

您的方向错误,应该与共享库(libav)链接。 将这些行添加到您的@overload def process(response: None) -> None: ... @overload def process(response: int) -> Tuple[int, str]: ... @overload def process(response: bytes) -> str: ... def process(response): <actual implementation> 中(并相应地更改您的设置的路径):

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:

答案 1 :(得分:0)

您可以使用Makefile为您完成所有工作。根据您的情况,您可以执行-

HEADERS=$(wildcard ../ffmpeg/*.h)
DEPENDS=$(wildcard ../../ffmpeg/libavformat/*.o)
TARGET=a.out

all: $(TARGET)

main.o: main.c $(HEADERS)
    $(CC) main.c -c -I../ffmpeg -o main.o


$(TARGET): main.o $(DEPENDS)
    $(CC) $^ -o $@

答案 2 :(得分:0)

您将需要使用makefile来包含构建二进制文件所需的所有目录。 这是一个简单的Makefile示例:

INCLUDE = \
        $(shell find ~/code/src/root/ -type d | sed s/^/-I/)
all: main.c
        @gcc -I$(INCLUDE) main.c -o test.out
clean: 
        @rm test.out

运行make all将生成main.c文件,并包括~/code/src/root/下的所有目录。另外,您可以在外壳程序上运行find ~/code/src/root/ -type d | sed s/^/-I/来查看所包含的所有目录。 希望这会有所帮助!