Make-файл стека BACnet

Я обновил этот пост 8/23, чтобы отразить рабочее решение.

Я работаю со стеком BACnet c на sourceforge. http://sourceforge.net/projects/bacnet/

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

Моя проблема сейчас заключается в том, что я не могу понять, как добавить свои собственные программы на C на демонстрационный сервер. В демоверсии есть несколько вложенных Make-файлов. Я пытался добавить свой файл в эти файлы Makefile, но компилятору (gcc) это не нравится.

Последняя ошибка: нет правила для цели ../../demo/object/test.o', needed bybacserv. Стоп.

Я не специалист по переменного тока. Я работал с этим в свое свободное время около года. Я понимаю основы Makefile, но Makefile в этом демо явно вне меня.

Есть ли кто-нибудь знакомый с этой библиотекой, который может мне немного помочь?

Есть ли лучшая документация, чем та, что есть на сайте sourceforge?

В этом примере я просто пытаюсь добавить test.c в ai.c.

/ Демо / сервер / Makefile

OBJECT_SRC = \
    $(BACNET_OBJECT)/device.c \
    $(BACNET_OBJECT)/ai.c \
    $(BACNET_OBJECT)/ao.c \
    $(BACNET_OBJECT)/av.c \
    $(BACNET_OBJECT)/bi.c \
    $(BACNET_OBJECT)/bo.c \
    $(BACNET_OBJECT)/bv.c \
    $(BACNET_OBJECT)/csv.c \
    $(BACNET_OBJECT)/lc.c \
    $(BACNET_OBJECT)/lsp.c \
    $(BACNET_OBJECT)/ms-input.c \
    $(BACNET_OBJECT)/mso.c \
    $(BACNET_OBJECT)/msv.c \
    $(BACNET_OBJECT)/nc.c  \
    $(BACNET_OBJECT)/trendlog.c \
    $(BACNET_OBJECT)/test.c \      <-- New entry
    $(BACNET_OBJECT)/bacfile.c

/ Библиотека / Makefile

CORE_SRC = \
$(BACNET_CORE)/apdu.c \
$(BACNET_CORE)/npdu.c \
$(BACNET_CORE)/bacdcode.c \
$(BACNET_CORE)/bacint.c \
$(BACNET_CORE)/bacreal.c \
$(BACNET_CORE)/bacstr.c \
$(BACNET_CORE)/bacapp.c \
$(BACNET_CORE)/bacprop.c \
$(BACNET_CORE)/bactext.c \
$(BACNET_CORE)/datetime.c \
$(BACNET_CORE)/indtext.c \
$(BACNET_CORE)/key.c \
$(BACNET_CORE)/keylist.c \
$(BACNET_CORE)/proplist.c \
$(BACNET_CORE)/debug.c \
$(BACNET_CORE)/bigend.c \
$(BACNET_CORE)/arf.c \
$(BACNET_CORE)/awf.c \
$(BACNET_CORE)/cov.c \
$(BACNET_CORE)/dcc.c \
$(BACNET_CORE)/iam.c \
$(BACNET_CORE)/ihave.c \
$(BACNET_CORE)/rd.c \
$(BACNET_CORE)/rp.c \
$(BACNET_CORE)/rpm.c \
$(BACNET_CORE)/timesync.c \
$(BACNET_CORE)/whohas.c \
$(BACNET_CORE)/whois.c \
$(BACNET_CORE)/wp.c \
$(BACNET_CORE)/wpm.c \
$(BACNET_CORE)/abort.c \
$(BACNET_CORE)/reject.c \
$(BACNET_CORE)/bacerror.c \
$(BACNET_CORE)/ptransfer.c \
$(BACNET_CORE)/memcopy.c \
$(BACNET_CORE)/filename.c \
$(BACNET_CORE)/tsm.c \
$(BACNET_CORE)/bacaddr.c \
$(BACNET_CORE)/address.c \
$(BACNET_CORE)/bacdevobjpropref.c \
$(BACNET_CORE)/bacpropstates.c \
$(BACNET_CORE)/alarm_ack.c \
$(BACNET_CORE)/event.c \
$(BACNET_CORE)/getevent.c \
$(BACNET_CORE)/get_alarm_sum.c \
$(BACNET_CORE)/readrange.c \
$(BACNET_CORE)/timestamp.c \
$(BACNET_CORE)/test.c \               <-- Do not include test.c in this Makefile at all
$(BACNET_CORE)/version.c

новые местоположения файлов:

test.c is located in /src             <-- Should be located in /demo/object
test.h is located in /include         <-- This works ok here

test.h

#ifndef _TEST_INCLUDE_
#define _TEST_INCLUDE_

void printit();

#endif

test.c

#include <stdio.h>                    <-- Needed to add #include <stdio.h>
#include "test.h"

void printit (){
    printf("it....");
}

/demo/object/ai.c

...
#include "handlers.h"
#include "timestamp.h"
#include "test.h"
#include "ai.h"
...
void Analog_Input_Init(
    void)
{
    unsigned i;
#if defined(INTRINSIC_REPORTING)
    unsigned j;
#endif
    printit(); //*****************************************************************
    for (i = 0; i < MAX_ANALOG_INPUTS; i++) {
        printf("Initializing AI:%u\n",i);
        AI_Descr[i].Present_Value = 0.0f;
        AI_Descr[i].Out_Of_Service = false;
        AI_Descr[i].Units = UNITS_PERCENT;
        AI_Descr[i].Reliability = RELIABILITY_NO_FAULT_DETECTED;
#if defined(INTRINSIC_REPORTING)
        AI_Descr[i].Event_State = EVENT_STATE_NORMAL;
        /* notification class not connected */
        AI_Descr[i].Notification_Class = BACNET_MAX_INSTANCE;
        /* initialize Event time stamps using wildcards
           and set Acked_transitions */
        for (j = 0; j < MAX_BACNET_EVENT_TRANSITION; j++) {
            datetime_wildcard_set(&AI_Descr[i].Event_Time_Stamps[j]);
            AI_Descr[i].Acked_Transitions[j].bIsAcked = true;
        }
        /* Set handler for GetEventInformation function */
        handler_get_event_information_set(OBJECT_ANALOG_INPUT,
            Analog_Input_Event_Information);
        /* Set handler for AcknowledgeAlarm function */
        handler_alarm_ack_set(OBJECT_ANALOG_INPUT, Analog_Input_Alarm_Ack);
        /* Set handler for GetAlarmSummary Service */
        handler_get_alarm_summary_set(OBJECT_ANALOG_INPUT,
            Analog_Input_Alarm_Summary);
#endif
    }
}

1 ответ

Решение

Я бы сказал, что ваш test.o не может быть сделан gcc. Makefile действительно указывает, чтобы создать его, хотя: .c.o: ${CC} -c ${CFLAGS} $*.c -o $@

Я заметил, что $(BACNET_OBJECT) в /demo/server/Makefile относится к пути /demo/object

Вы должны попытаться добавить test.c туда.

И я считаю, что вам не нужно добавлять test.c в /lib/Makefile

Давно я не делал никаких C, но ты не забыл #include <stdio.h> для printf в test.c?

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