Как решить эту проблему с ссылками в Makefile? - PullRequest
1 голос
/ 25 ноября 2010

Вот мой 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)/$@

$(MAIN).o: $(SRC_DIR)/$(MAIN).c
    $(CC) $^ -I $(INC_DIR) -o $@

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)?

Заранее спасибо за ваши ответы.

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

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

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

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

Я бы переписал некоторые из ваших make-файлов:

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

...

$(MAIN): $(MAIN).o
    $(CC) $^ $(LDFLAGS) $(LIBS) -o $(BIN_DIR)/$@
1 голос
/ 25 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...