Импорт настроек Makefile в IDE VS2005

Я новичок в этом огромном мире программирования. Мне дали несколько кодов на C, которые скомпилированы и связаны с использованием make-файла. Я могу скомпилировать код с помощью nmake из VS2005. Теперь я хочу собрать программу в C++ VS2005 IDE. Из быстрого поиска в Google, похоже, нет автоматических функций при импорте настроек make-файла в VS IDE.

Я попытался включить все необходимые зависимости (заголовочные файлы и файлы lib), указанные в make-файле, в VS, но я получаю много ошибок компоновки. Я даже не уверен, где начать искать решение проблемы. Я надеюсь, что гуру могут помочь мне.

Это содержимое makefile:

BASE        = ..\..
!include $(BASE)\compiler.mak
!include $(BASE)\options.mak                                                            

CFLAGS      = 

# Define the string used in the executable file name
STACK_DEF   = $(TCP_DEF)

!ifdef TCP_DEF
STACKS      = tcp
!endif

CDEFS       = $(STACK_DEF) $(AUTH_DEF) $(CLIENT_DEF) $(FILESERVICE_DEF)

TARGET      = $(STACKS)$(NAMETAG).$(EXESUFFIX)

GOMDIR      = $(BASE)\src\classlib
DIRMAKE     = $(BASE)\src\make7
LIBDIR      = $(BASE)\lib
OBJDIR      = obj_$(NAMETAG)
EXEDIR      = $(BASE)\exes
USERINC     = $(BASE)\include

# These libraries are always included
TAMLIB      = $(LIBDIR)\tam_$(NAMETAG).lib
TAMCLIB     = $(LIBDIR)\tamc_$(NAMETAG).lib
MMSLIB      = $(LIBDIR)\mmsc_$(NAMETAG).lib

# Optional libraries
!ifdef FILESERVICE_DEF
FILELIB     = $(LIBDIR)\file_$(NAMETAG).lib
!endif

!ifdef TCP_DEF
TCPLIB      = $(LIBDIR)\1006_$(NAMETAG).lib
TCPINC      = $(USERINC)\rfc1006.h
!endif

!ifdef CLIENT_DEF
CLILIB      = $(LIBDIR)\cli_$(NAMETAG).lib
TCLILIB     = $(LIBDIR)\tcli_$(NAMETAG).lib
CLIINC      = $(USERINC)\cliapi.h $(USERINC)\cli_cfg.h
!endif

SCLLIB      = $(LIBDIR)\cscl_$(NAMETAG).lib

LIBS        = $(TCPLIB) $(TCLILIB) $(CLILIB) \
          $(TAMLIB) $(TAMCLIB) $(MMSLIB) $(FILELIB) $(SCLLIB)

INCLUDES    = $(TCPINC) $(CLIINC)

CC          = $(COMPILER)
INCFLAGS    = /I$(DIRMAKE) /I$(USERINC)

SRC         = conmain.c \
          state.c \
          scl_cli.c

OBJ         = $(OBJDIR)\$(STACKS)main.$(OBJSUFFIX) \
          $(OBJDIR)\state.$(OBJSUFFIX) \
          $(OBJDIR)\scl_cli.$(OBJSUFFIX)

all:        $(TARGET)

install:    all

clean:
        $(DELETE) $(OBJDIR)\$(STACKS)main.$(OBJSUFFIX)
        $(DELETE) $(OBJDIR)\state.$(OBJSUFFIX)
        $(DELETE) $(OBJDIR)\scl_cli.$(OBJSUFFIX)
        $(DELETE) $(TARGET)

clobber:    clean

$(TARGET):      $(OBJ) $(LIBS)
        $(LINK) $(LINKOUT)$(TARGET) @<<
    $(OBJDIR)\$(STACKS)main.$(OBJSUFFIX)
    $(OBJDIR)\state.$(OBJSUFFIX)
    $(OBJDIR)\scl_cli.$(OBJSUFFIX)
    $(LIBS)
    $(WINDIS) $(SOCKLIB) $(REGLIB)
<<NOKEEP

$(OBJDIR)\$(STACKS)main.$(OBJSUFFIX): \
        conmain.c \
        database.h \
        services.h \
        scl_cli.h \
        $(USERINC)\uca_time.h \
        $(DIRMAKE)\tamvend.h \
        $(USERINC)\tam.h \
        $(USERINC)\tam_tp.h \
        $(USERINC)\tam_con.h \
        $(USERINC)\casm.h \
        $(DIRMAKE)\clivend.h \
        $(USERINC)\cliapi.h \
        $(DIRMAKE)\mmsdapi.h $(INCLUDES)
        $(CC) $(INCFLAGS) $(CFLAGS) @<<
            $(CDEFS)
            $(COMPOUT)$(OBJDIR)\$(STACKS)main.$(OBJSUFFIX)
            conmain.c
<<NOKEEP

$(OBJDIR)\scl_cli.$(OBJSUFFIX): \
        scl_cli.c \
        scl_cli.h \
        database.h \
        services.h \
        $(USERINC)\uca_time.h \
        $(DIRMAKE)\tamvend.h \
        $(USERINC)\tam.h \
        $(USERINC)\tam_tp.h \
        $(USERINC)\tam_con.h \
        $(USERINC)\casm.h \
        $(DIRMAKE)\clivend.h \
        $(USERINC)\cliapi.h \
        $(DIRMAKE)\mmsdapi.h $(INCLUDES)
        $(CC) $(INCFLAGS) $(CFLAGS) @<<
            $(CDEFS)
            $(COMPOUT)$(OBJDIR)\scl_cli.$(OBJSUFFIX)
            scl_cli.c
<<NOKEEP

$(OBJDIR)\state.$(OBJSUFFIX): \
        state.c \
        scl_cli.h \
        database.h \
        services.h \
        $(USERINC)\uca_time.h \
        $(DIRMAKE)\tamvend.h \
        $(USERINC)\tam.h \
        $(USERINC)\tam_tp.h \
        $(USERINC)\tam_con.h \
        $(USERINC)\casm.h \
        $(DIRMAKE)\clivend.h \
        $(USERINC)\cliapi.h \
        $(DIRMAKE)\mmsdapi.h $(INCLUDES)
        $(CC) $(INCFLAGS) $(CFLAGS) @<<
            $(CDEFS)
            $(COMPOUT)$(OBJDIR)\state.$(OBJSUFFIX)
            state.c
<<NOKEEP

В VS я:
[1] Создать новый пустой проект
[2] Добавить существующие источники (c файлами и заголовочными файлами)
[3] Дополнительные каталоги включения: ..../include и.... / src / make7
[4] Дополнительные каталоги библиотеки:.... / lib
[5] Построить проект...

Я получил 74 ошибки компоновщика на выходе VS после попытки сборки. Все неразрешенные ошибки внешних символов Пример:

scl_cli.obj : error LNK2019: unresolved external symbol _TAM_parse_address referenced in function _ResolveServerAddressscl_cli.obj : error LNK2019: unresolved external symbol _TAM_parse_address referenced in function _ResolveServerAddress
conmain.obj : error LNK2001: unresolved external symbol _MMSd_freeDsMemFunction

Я не имел дело с make-файлами раньше. Я прошу прощения, если этот пост может звучать очень новичок стиль и любительское. Я новичок, но я хочу учиться.

Любые советы и комментарии с благодарностью.

jjplaw

1 ответ

Решение

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

Встроенная система сборки Visual Studio не масштабируется! Когда ваш проект достигает определенного размера, он становится больше помехой, чем что-либо еще. Microsoft признает этот факт и в настоящее время выдвигает свою альтернативу MSBuild.

Попробуйте изменить опцию компиляции, если ваше решение содержит более 80 различных подпроектов... Это - щелчок мышью, утомительный и подверженный ошибкам...

На данный момент у вас будут следующие опции:

  1. Редактирование файлов проекта вручную (все еще очень много файлов).
  2. Генерация решения Visual Studio из описания.
  3. Интегрируйте альтернативную систему сборки в IDE (если таковая существует).
  4. Использование более адекватной внешней системы сборки и вызов ее из IDE (вы также получаете возможность стать кроссплатформенным).

Это варианты make (сборка ведется через Makefiles или аналогичные):

  • nmake: вероятно, наименее мощный, только для Windows
  • OMake: кроссплатформенная (приятно)
  • Scons: кроссплатформенный (никогда не использовал его)
  • CMake: кроссплатформенный (никогда не использовал его)
  • Грабли: кросс-платформенный (отстой)
  • gmake: кроссплатформенный, но ожидайте проблем с путями на окнах (происходит из мира 'nix)

Это муравьиные варианты (сборка управляется описаниями xml вместо make-файлов):

  • Nant
  • MSBuild (от Microsoft)

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

Что касается вашей проблемы, вы забыли добавить библиотеки, перечисленные в следующем фрагменте:

TAMLIB      = $(LIBDIR)\tam_$(NAMETAG).lib
TAMCLIB     = $(LIBDIR)\tamc_$(NAMETAG).lib
MMSLIB      = $(LIBDIR)\mmsc_$(NAMETAG).lib
Другие вопросы по тегам