Make-файл: как изменить определенное правило

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

Я - довольно новый пользователь Ubuntu и если возможный я нуждаюсь в некоторой помощи с определенным Make-файлом. Я загрузил 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

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

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

но ища реальную реализацию Make-файла QEMU я нашел rules.mak файл где:

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

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

%.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 файл. Я хотел бы создать новый Make-файл, где все другие файлы продолжают компилироваться как исходный Make-файл, но когда дело доходит до sd.c я хотел бы, чтобы он был скомпилирован, как сказано прежде, для предотвращения неопределенных ссылок

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

0
задан 30 September 2014 в 01:49

2 ответа

Я думаю после дней сомнений, исследований, руководства и так далее, я наконец решил свою проблему и я хочу совместно использовать свои усилия с Вами

После того, как steeldriver комментируют, что я начал наблюдать более тесно связывающуюся фазу. Решение, которое я нашел, добавляло следующие строки к файлу конфигурации незадолго до аналога librt раздел:

##########################################
# Do we need libgsl0-dev
cat > $TMPC << EOF
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
int main(void) { return (int) gsl_ran_weibull_pdf (11, 10, 5); }
EOF
if compile_prog "" "" ; then
  :
elif compile_prog "" "-lgsl -lgslcblas" ; then
  LIBS="-lgsl -lgslcblas $LIBS"
  libs_qga="-lgsl -lgslcblas $libs_qga"
else
  error_exit "libgsl0-dev check failed"
fi

цель gsl_ran_weibull_pdf (11, 10, 5) проверяет присутствие libgsl0-dev. Если у нас есть он чем тогда, когда мы находим,-lgsl-lgslcblas мы можем правильно interpretate их, еще пользователю сообщат об отсутствии этой библиотеки

Теперь, когда я введу: ubuntu@ubuntu: ~/Desktop/qemu-2.1.0$ делают

больше нет неопределенных ссылок:

  GEN   config-host.h
  GEN   trace/generated-tracers.h
  GEN   trace/generated-tracers.c
  CC    hw/sd/sd.o
  GEN   arm-softmmu/config-target.h
  LINK  arm-softmmu/qemu-system-arm
  GEN   arm-linux-user/config-target.h

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

Особая благодарность @muru и @steeldriver для их поддержки

0
ответ дан 7 October 2019 в 00:56

Выше этой подстановочной строки:

%.o: %.c

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

myfile.o: myfile.c
    gcc -c -o $@ $< -lgsl -lgslcblas -lm
0
ответ дан 6 October 2019 в 14:56

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

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