Не удалось связать с BFD

Я пытаюсь включить этот файл в свой проект: http://cairo.sourcearchive.com/documentation/1.9.4/backtrace-symbols_8c-source.html

Но для этого требуется привязка к BFD. У меня установлены и binutils, и binutils-devel. Я пробовал связываться с -lbfd, а также напрямую с /usr/lib64/libbfd.so и /usr/lib64/libbfd.a (оба существуют). Я также попытался найти pkg-config, чтобы увидеть, есть ли другой флаг, который я должен использовать, но в pkg-config нет ссылки на BFD или binutils.

Независимо от того, что я пробовал, я получаю следующие ошибки:

undefined reference to 'bfd_init'
undefined reference to 'bfd_openr'
undefined reference to 'bfd_check_format'
undefined reference to 'bfd_checkformat_matches'
undefined reference to 'bfd_close'
undefined reference to 'bfd_map_over_sections'

Сначала я компилирую свой регистратор и файл backtrace-symbols.c, на который я ссылался выше (поскольку регистратор — это то место, где я намереваюсь использовать его для печати трассировок). Затем я связываю эти два объектных файла вместе в комбинированный объектный файл:

CC = clang
CFLAGS = -g -Wall -c
SOURCE = simplog.c
OBJ = simplog.o, simplog-temp.o, backtrace-symbols.o

all:
    $(CC) $(CFLAGS) $(SOURCE); mv simplog.o simplog-temp.o; \
    $(CC) -ansi $(CFLAGS) backtrace-symbols.c; \
    ld -r simplog-temp.o backtrace-symbols.o -o simplog.o

clean:
    rm -f $(OBJ) 

Затем я связываю этот объектный файл со своим основным проектом:

CC= clang++
PROG= ./bin/chiplus8
OBJS= ./src/main.o ./src/Chip8.o ./src/EmuCPU.o ./src/SimpleLogger/simplog.o
LIBS= 
CXXFLAGS= -g -Wall -std=c++11 $(shell pkg-config --cflags ${LIBS})
LDFLAGS= $(shell pkg-config --static --libs ${LIBS})

all: logger $(PROG)

$(PROG): $(OBJS)
    mkdir -p ./bin/
    $(CC) -g -rdynamic -o $(PROG) $(LDFLAGS) -lbfd -liberty $(OBJS)
    rm -f $(OBJS)

logger:
    cd ./src/SimpleLogger; make clean all

clean:
    rm -f $(PROG) $(OBJS)

Я действительно не уверен, что мне нужно сделать, чтобы это правильно связывалось. Есть что-то, что мне не хватает?


person PseudoPsyche    schedule 04.01.2014    source источник
comment
Ваш заголовок немного вводит в заблуждение; вы не ссылаетесь на файл .h. Обновите свой вопрос, чтобы указать точную команду, которую вы пытаетесь выполнить; порядок аргументов командной строки может быть критическим.   -  person Keith Thompson    schedule 04.01.2014
comment
Обновлено с моими Makefiles и объяснением использования.   -  person PseudoPsyche    schedule 04.01.2014


Ответы (1)


Изменять:

$(PROG): $(OBJS)
    mkdir -p ./bin/
    $(CC) -g -rdynamic -o $(PROG) $(LDFLAGS) -lbfd -liberty $(OBJS)
    rm -f $(OBJS)

К этому:

$(PROG): $(OBJS)
    mkdir -p ./bin/
    $(CC) -g -rdynamic -o $(PROG) $(LDFLAGS) $(OBJS) -lbfd -liberty
    rm -f $(OBJS)

Объектные файлы должны быть размещены перед библиотеками с помощью команды компиляции. См. этот вопрос.

person tay10r    schedule 04.01.2014
comment
Спасибо! Это было проблемой! Кажется, сейчас все в основном работает. - person PseudoPsyche; 04.01.2014