将Makefile设置导入VS2005 IDE

时间:2009-07-01 06:39:36

标签: c++ c visual-studio-2005 makefile nmake

我是这个广阔的编程世界的新手。我已经在C中获得了一些编译和编码的代码。使用makefile链接。我可以使用VS2005中的nmake编译代码。现在我想在C ++ VS2005 IDE中构建程序。 通过快速谷歌搜索,似乎没有自动功能将makefile设置导入VS IDE。

我试图将makefile中声明的所有必要的dependecies(头文件和lib文件)包含在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]建立项目......

尝试构建后,VS输出有74个链接器错误。所有都是未解决的外部符号错误 例如:

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

我之前没有处理过makefile。如果这篇文章听起来很新手风格和amatuer-ish,我很抱歉。我很新,但我愿意学习。

非常感谢任何建议和评论。

jjplaw

1 个答案:

答案 0 :(得分:0)

如果我是你,我会在IDE中迁移构建之前再三考虑。我明白这似乎对你来说更加舒适,但内置的构建设施非常有限。

Visual Studio的内置构建系统无法扩展!当你的项目达到一定的规模时,它就会成为一个障碍而不是其他任何东西。微软认识到了这一事实,并且目前正推行其名为 MSBuild 的替代方案。

当您的解决方案包含超过80个不同的子项目时,尝试修改编译选项...这是一个鼠标clic fest,乏味且容易出错......

此时您将拥有以下选项:

  1. 手动编辑项目文件(仍有大量文件)。
  2. 从描述生成Visual Studio解决方案。
  3. 在IDE中集成替代构建系统(如果存在)。
  4. 使用更合适的外部构建系统并从IDE调用它(您也有机会成为跨平台)。
  5. 这些是变体(构建由Makefile或类似的驱动):

    • nmake:可能是最不强大的,只有Windows
    • OMake:跨平台(不错)
    • Scons:跨平台(从未使用过它)
    • CMake:跨平台(从未使用过它)
    • Rake:跨平台(糟透了)
    • gmake:跨平台,但期望Windows上的路径出现问题(来自'nix world)

    这些是ant变体(构建由xml描述而不是makefile驱动):

    • 恶性
    • MSBuild(来自Microsoft)

    无论如何,请记住在IDE外部编译阻止您使用它进行编辑,调试(调试器很好)等等!

    关于您的问题,您忘记添加以下摘录中列出的库:

    TAMLIB      = $(LIBDIR)\tam_$(NAMETAG).lib
    TAMCLIB     = $(LIBDIR)\tamc_$(NAMETAG).lib
    MMSLIB      = $(LIBDIR)\mmsc_$(NAMETAG).lib