在这个广阔的编程世界里,我是一个新手。我得到了一些用C语言编写的代码,这些代码是使用makefile编译和链接的。我可以使用VS2005中的nmake来编译代码。现在,我想在C++ VS2005集成开发环境中构建程序。通过快速的google搜索,似乎没有自动功能将makefile设置导入到VS IDE中。
我尝试将makefile中声明的所有必要依赖项(头文件和库文件)包含到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。我很抱歉,如果这篇文章听起来很新手的风格和业余的。我是新手,但我愿意学习。
任何建议和评论都是非常感谢的。
jjplaw
发布于 2009-07-01 08:03:10
如果我是您,在IDE中迁移构建之前,我会三思而后行。我知道这对你来说似乎更舒服,但内置的建筑设施真的很有限。
Visual Studio的内置构建系统不能扩展!当你的项目达到一定的规模时,它就成了最大的障碍。微软认识到了这一事实,目前正在推动他们名为MSBuild的替代方案。
当您的解决方案包含超过80个不同的子项目时,尝试修改编译选项...这是一个耗子循环的盛会,单调乏味,容易出错...
此时,您将有以下选项:
这些是make变体(构建是由Makefiles或类似文件驱动的):
<代码>F225
这些是ant的变体(构建是由xml描述驱动的,而不是makefile):
无论如何,请记住,在集成开发环境外编译不会阻止您使用它进行编辑、调试(而且调试器很棒)等等!
关于您的问题,您忘记添加以下摘录中列出的库:
TAMLIB = $(LIBDIR)\tam_$(NAMETAG).lib
TAMCLIB = $(LIBDIR)\tamc_$(NAMETAG).lib
MMSLIB = $(LIBDIR)\mmsc_$(NAMETAG).libhttps://stackoverflow.com/questions/1067594
复制相似问题