2009-07-01 77 views
0

我是這個廣闊的編程世界的新手。我已經給出了一些C代碼,它們編譯爲使用makefile鏈接的&。我可以使用VS2005中的nmake編譯代碼。現在我想在C++ VS2005 IDE中構建程序。 從快速谷歌搜索,似乎沒有自動功能導入生成文件設置到VS IDE。將Makefile設置導入到VS2005 IDE

我試圖包含在makefile中聲明的所有必要的依賴項(頭文件和lib文件)到VS,但我得到了很多鏈接錯誤。我甚至不知道從哪裏開始着手解決問題。我希望大師能幫助我。

這是生成文件內容:

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]加入exisiting源(C文件和頭文件)
[3]附加包含目錄:.... /包括和..../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 

我以前沒處理的makefile。我很抱歉,如果這篇文章聽起來很新鮮風格和amatuer-ish。我是新人,但我願意學習。

任何意見和建議,非常感謝。

jjplaw

回答

0

如果我是你,我會在IDE中遷移構建三思而行。我知道這對你來說似乎更舒適,但內建的設施非常有限。

Visual Studio的內置生成系統不能縮放!當你的項目達到一定規模時,它比其他任何東西都更容易受到阻礙。微軟認識到這一事實,並且目前推出了替代方案,稱爲MSBuild

嘗試修改當你的解決方案包含超過80個不同的子項目編譯選項...這是一個鼠標CLIC巨星,繁瑣,而且容易出錯...

此時,您將有以下選項:

  1. 手動編輯項目文件(仍然是非常多的文件)。
  2. 從描述中生成Visual Studio解決方案。
  3. 在IDE中集成替代構建系統(如果存在)。
  4. 使用更充足的外部構建系統並從IDE調用它(您也有機會成爲跨平臺)。

這些都是使變體(編譯通過生成文件或類似的驅動):

  • NMAKE:可能是最強大的,僅適用於Windows
  • OMake:跨平臺(NICE)
  • 使用SCons:跨平臺(從未使用過)
  • CMake:跨平臺(從未使用過)
  • 耙:跨平臺(糟糕)
  • 使用gmake:跨平臺,但預期在Windows上的路徑問題(來自「尼克斯世界)

這些都是螞蟻變體(生成由XML描述,而不是生成文件驅動):

  • 的MSBuild(微軟)

無論如何,請記住,編譯IDE外部不阻止你使用它編輯,調試(和調試器很好)等等!

關於你的問題,你忘了添加以下摘錄中列出的庫:

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

有人告訴我,遷移到VS IDE,因爲我要的代碼整合上面配置VS 2005℃的DDK ++ 。選項4非常有趣。我需要谷歌了這一點。這是否意味着我可以從VS IDE調用OMAKE來讀取makefile並生成exe文件? 或者它只是使用不同的構建系統?它不使用makefile,我已經輸入編譯器和鏈接器選項到IDE? – justin 2009-07-03 03:30:15