Как связать все объектные файлы в папке при компиляции C? - PullRequest
0 голосов
/ 22 сентября 2018

Итак, у меня есть две папки:

/ 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.d.Но как мне это сделать в командной строке?Есть тонны, тонны, тонны зависимостей, и я знаю, что люди не вводят их вручную!

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

Вам нужно будет использовать make-файл, чтобы включить все каталоги, необходимые для сборки вашего двоичного файла.Вот простой пример 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/ в своей оболочке, чтобы увидеть все включенные каталоги.Надеюсь, это поможет!

0 голосов
/ 23 сентября 2018

Вы идете в неверном направлении, вам следует связаться с общими библиотеками (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)
0 голосов
/ 22 сентября 2018

Вы можете использовать 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 $@
...