Makefile: как изменить определенное правило

Это мой первый вопрос здесь, я надеюсь сделать все правильно.

Я совершенно новый пользователь Ubuntu, и по возможности мне нужна помощь с определенным Makefile. Я загрузил QEMU 2.1.0, и в настоящее время я изменяю некоторые файлы исходного кода для пользовательской версии. В частности, у меня есть файл sd.c, такой как:

[...]
#include "hw/mydistribution.h"
[...]
Nac = poisson_distribution(Nac_mean);

и файл mydistribution.h, где, например, я определяю poisson_distribution (), используя функции из библиотеки GSL:

#include <math.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
[...]
unsigned int poisson_distribution(double expected_value) {

const gsl_rng_type * T;
gsl_rng * r;
unsigned int k;

gsl_rng_env_setup();
T = gsl_rng_default;
r = gsl_rng_alloc (T);
k = gsl_ran_poisson (r, expected_value);
gsl_rng_free (r);

return k;
}

Теперь я знаю, что если бы у меня были все вышеупомянутые части в одном файле [например, myfile.c] Я могу скомпилировать из терминала, используя:

gcc myfile.c -o myfile -lgsl -lgslcblas -lm

, и он работает, потому что я пытался. Но как попросить QEMU Makefile сделать это? Честно говоря, этот Makefile кажется слишком сложным для моего начального уровня. Я googled информация о make-файлах, и после прочтения я подумал найти в QEMU Makefile что-то вроде:

LDLIBS := -lgsl -lgslcblas -lm
[...]
$(CC) -o $@ $^ $(LDLIBS)

, но ищет реальную реализацию QEMU Makefile. Я нашел файл rules.mak, где:

[ f5]

Возможно, это строка для настройки. Вопрос в том, как настроить? Я попытался отредактировать эту строку как:

%.o: %.c
    $(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $< -lgsl -lgslcblas -lm,"  CC    $(TARGET_DIR)$@")

, но это не сработало, и у меня появились следующие ошибки

ubuntu@ubuntu:~/Desktop/qemu-2.1.0$ make
  GEN   config-host.h
  GEN   trace/generated-tracers.h
  GEN   trace/generated-tracers.c
  GEN   arm-softmmu/config-target.h
  LINK  arm-softmmu/qemu-system-arm
../hw/sd/sd.o: In function `poisson_distribution':
/home/ubuntu/Desktop/qemu-2.1.0/include/hw/mycard.h:1630: undefined reference to `gsl_rng_env_setup'
/home/ubuntu/Desktop/qemu-2.1.0/include/hw/mycard.h:1632: undefined reference to `gsl_rng_default'
/home/ubuntu/Desktop/qemu-2.1.0/include/hw/mycard.h:1633: undefined reference to `gsl_rng_alloc'
/home/ubuntu/Desktop/qemu-2.1.0/include/hw/mycard.h:1641: undefined reference to `gsl_ran_poisson'
/home/ubuntu/Desktop/qemu-2.1.0/include/hw/mycard.h:1646: undefined reference to `gsl_rng_free'
../hw/sd/sd.o: In function `weibull_distribution':
/home/ubuntu/Desktop/qemu-2.1.0/include/hw/mycard.h:1676: undefined reference to `gsl_rng_env_setup'
/home/ubuntu/Desktop/qemu-2.1.0/include/hw/mycard.h:1678: undefined reference to `gsl_rng_default'
/home/ubuntu/Desktop/qemu-2.1.0/include/hw/mycard.h:1679: undefined reference to `gsl_rng_alloc'
/home/ubuntu/Desktop/qemu-2.1.0/include/hw/mycard.h:1687: undefined reference to `gsl_ran_weibull'
/home/ubuntu/Desktop/qemu-2.1.0/include/hw/mycard.h:1692: undefined reference to `gsl_rng_free'
collect2: error: ld returned 1 exit status
make[1]: *** [qemu-system-arm] Error 1
make: *** [subdir-arm-softmmu] Error 2

И в конце концов я думаю, что это не будет идеальное решение, поскольку другим файлам не нужна библиотека GSL, и нет необходимости применять -lgsl -lgslcblas -lm для каждого файла .c. Я хотел бы создать новый Makefile, где все остальные файлы будут компилироваться, как исходный Makefile, но когда дело доходит до sd.c, я бы хотел, чтобы он был скомпилирован, как сказано ранее, чтобы избежать неопределенных ссылок

Заранее благодарим людей, которые дадут мне точные предложения, которые помогут мне исправить эту проблему

1
задан 30 September 2014 в 02:49

1 ответ

Над этой подстановочной линией:

%.o: %.c

добавить определенное правило для конкретного файла:

myfile.o: myfile.c
    gcc -c -o $@ $< -lgsl -lgslcblas -lm
0
ответ дан 24 May 2018 в 03:16
  • 1
    Привет, муру, тем временем спасибо за ваш быстрый ответ. Я добавил правило, как было предложено, но у меня все еще есть те же неопределенные ссылки. Тем не менее, спасибо снова – Antonino 30 September 2014 в 03:09
  • 2
    Это фаза связи, которая вызывает ошибку, поэтому я не думаю, что все, что вы делаете в фазе compile (т.е. .o: %.c), поможет - вам нужно найти строку, которая строит исполняемая цель из файлов объекта (.o) – steeldriver 30 September 2014 в 03:15
  • 3
    Привет, steeldriver, ваша первая часть ответа совершенно ясна. Вторая часть понятна только с теоретической точки зрения, но не на практике, потому что моих знаний недостаточно, чтобы понять некоторые голоса Makefile, такие как DSOSUF, EXESUF, LINK, тихая команда и т. Д., Которые участвуют в создании исполняемой цели , Если кто-то может быть больше QEMU-специфичным, я был бы счастливее, но благодаря вам тоже за ваш добрый пост – Antonino 30 September 2014 в 17:48
  • 4
    @Antonino ищет правило makefile, которое перечисляет что-то вроде $ (OBJ) или & lt; something & gt; .o в правой части :. Вероятно, это будет содержать правило для связывания. Если нет, отправьте файл makefile на paste.ubuntu.com , чтобы мы могли его изучить. – muru 30 September 2014 в 18:03
  • 5
    Привет muru, так как пост steeldriver я искал что-то в форме: CC = g ++ CFLAGS = -c -Wall LDFLAGS = SOURCES = main.cpp hello.cpp factorial.cpp OBJECTS = $ (ИСТОЧНИКИ: .cpp = .o) EXECUTABLE = hello all: $ (SOURCES) $ (EXECUTABLE) $ (EXECUTABLE): $ (OBJECTS) $ (CC) $ (LDFLAGS) $ (OBJECTS) -o $ @ .cpp.o: $ (CC) $ (CFLAGS) $ & Lt; -o $ @, надеясь, что добавление -lgsl -lgslcblas -lm в $ (CC) $ (LDFLAGS) $ (OBJECTS) -o $ @ может сделать трюк. Но, как сказано ранее, Makefile намного сложнее. Затем я добавил 4 полезных файла в paste.ubuntu.com/8466403 Еще раз спасибо за ваш интерес и ваш второй ответ – Antonino 30 September 2014 в 19:43

Другие вопросы по тегам:

Похожие вопросы: