2010-11-25 3 views
1

Вот мой Makefile:Как решить эту проблему связи в Makefile?

DIR=.. 
ARG=$(QUERY_STRING) 

MAIN=main 

SRC_DIR=$(DIR)/src 
BIN_DIR=$(DIR)/bin 
INC_DIR=$(DIR)/inc 
LIB_DIR=$(DIR)/lib 

LIBS=markdown 

all: $(MAIN) exec 


$(MAIN): $(MAIN).o 
    $(LD) $^ -L $(LIB_DIR) -l $(LIBS) -o $(BIN_DIR)/[email protected] 

$(MAIN).o: $(SRC_DIR)/$(MAIN).c 
    $(CC) $^ -I $(INC_DIR) -o [email protected] 

exec: 
    $(BIN_DIR)/$(MAIN) $(ARG) 

clean: 
    rm -f *.o core.* $(BIN)/$(MAIN) 

Это четко определено, как организован мой проект, поэтому я не буду объяснять. Он компилируется без каких-либо проблем, но на бинарном исполнении $(BIN_DIR)/$(MAIN) появляется следующее сообщение об ошибке:

../bin/main: error while loading shared libraries: rintf: cannot open shared object file: No such file or directory 
make: *** [exec] Error 127 

Что библиотека делает rintf принадлежат? Я тоже пытался связать -lc, но это не решает проблему.

Что-то не так с моим Makefile? Или мне нужно связать что-то дополнительное с $(MAIN)?

Заранее благодарим за ваши ответы.

ответ

3

Вы по существу никогда не свяжете программу, вызвав непосредственно ld; всегда используйте свой компилятор для соединения. Он передает всевозможные дополнительные аргументы ld, чтобы все сработало. Замените $(LD) на $(CC). Сделайте это независимо от того, действительно ли это исправляет вашу проблему или нет.

'Нечетно, что вы не получили имя общего объекта, указанного в сообщении об ошибке.

Эта страница руководства для rintf() указывает, что она заявлена ​​в <math.h>; скорее всего, вам нужно добавить библиотеку математики к линии ссылок: -lm.

Я бы переписать некоторые из ваших Makefile:

LIB1 = -lmarkdown 
LIB2 = -lm 
LIBS = $(LIB1) $(LIB2) 
LDFLAGS = -L $(LIB_DIR) 

... 

$(MAIN): $(MAIN).o 
    $(CC) $^ $(LDFLAGS) $(LIBS) -o $(BIN_DIR)/[email protected] 
+2

+1. Кроме того, правило `all: $ (MAIN) exec` неразумно; Make не обещает построить предпосылки цели в порядке слева направо. Лучше: `all: exec` и` exec: $ (MAIN) `. – Beta 2010-11-25 16:58:57

1

Обычно эта ошибка появляется, когда компоновщик не может найти необходимый общий объект (.so-файл). Я предполагаю платформу Linux.

В ОС Linux вы можете искать файл, используя: find, или locate. Если вы можете найти файл .so, попробуйте обновить кеш компоновщика, используя ldconfig. Если это не сработало, проверьте файлы конфигурации компоновщика под /etc/ld.conf.d/, чтобы узнать, включен ли путь к библиотеке. Если вы изменили конфигурацию, не забудьте снова обновить кеш!

Смежные вопросы