将 Makefile 设置导入 VS2005 IDE
Posted
技术标签:
【中文标题】将 Makefile 设置导入 VS2005 IDE【英文标题】:Import Makefile settings to VS2005 IDE 【发布时间】:2009-07-01 06:39:35 【问题描述】:我是这个广阔的编程世界的新手。我得到了一些 C 代码,这些代码是使用 makefile 编译和链接的。我可以使用 VS2005 中的 nmake 编译代码。现在我想在 C++ VS2005 IDE 中构建程序。 从谷歌快速搜索来看,似乎没有将 makefile 设置导入 VS IDE 的自动化功能。
我试图将 makefile 中声明的所有必要依赖项(头文件和 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。如果这篇文章听起来很新手风格和业余风格,我深表歉意。我是新手,但我愿意学习。
非常感谢任何建议和评论。
jjplaw
【问题讨论】:
【参考方案1】:如果我是你,我会在 IDE 中迁移构建之前三思而后行。我知道这对您来说似乎更舒服,但内置的构建设施确实有限。
Visual Studio 的内置构建系统无法扩展!当你的项目达到一定的规模时,它就变成了比其他任何事情都更大的障碍。微软认识到这一事实,目前正在推动他们的替代方案,称为 MSBuild。
当您的解决方案包含超过 80 个不同的子项目时,请尝试修改编译选项...这是一个鼠标点击节,乏味且容易出错...
此时您将有以下选项:
-
手动编辑项目文件(仍然有很多文件)。
根据描述生成 Visual Studio 解决方案。
在 IDE 中集成替代构建系统(如果存在)。
使用更合适的外部构建系统并从 IDE 调用它(您也有机会成为跨平台)。
这些是 make 变体(构建由 Makefile 或类似驱动):
nmake:可能是最不强大的,仅限 Windows OMake:跨平台(不错) Scons:跨平台(从未使用过) CMake:跨平台(从未使用过) Rake:跨平台(糟透了) gmake:跨平台,但预计 Windows 上的路径会出现问题(来自“nix 世界”)这些是 ant 变体(构建由 xml 描述而不是 makefile 驱动):
南特 MSBuild(来自 Microsoft)无论如何,请记住,在 IDE 外部编译确实不会阻止您使用它进行编辑、调试(而且调试器很好)等等!
关于您的问题,您忘记添加以下摘录中列出的库:
TAMLIB = $(LIBDIR)\tam_$(NAMETAG).lib
TAMCLIB = $(LIBDIR)\tamc_$(NAMETAG).lib
MMSLIB = $(LIBDIR)\mmsc_$(NAMETAG).lib
【讨论】:
我被告知要迁移到 VS IDE,因为我必须将上面的代码与为 VS 2005 C++ 配置的 DDK 集成。选项 4 非常有趣。我需要用谷歌搜索这个。这是否意味着我可以从 VS IDE 调用 OMAKE(例如)来读取 makefile 并构建 exe?或者它只是使用不同的构建系统?它不使用 makefile,我已将编译器和链接器选项输入到 IDE? 您能否详细说明您的答案“在 IDE 外部编译不会阻止使用它进行调试”。我可以使用断点和设置手表吗? @justin,评论 2:IDE 可用于调试任何程序。您从 C++ 程序或库的解决方案开始,只需填写调试设置(路径、命令行选项、源目录)即可。 @justin,评论 1:选择构建工具后,请参阅其文档以获取更多信息。通过“自定义构建步骤”从 IDE 中调用该工具,并记住不会传播编译/链接选项:外部构建系统将独立于 IDE。 我强烈推荐 CMake,它还会为你生成 MSVC2005 项目文件。以上是关于将 Makefile 设置导入 VS2005 IDE的主要内容,如果未能解决你的问题,请参考以下文章
vs2005新建项目中没有ASP.NET WEB应用程序,如何建立?
VS2005的.NET Framework 2.0升级成NET Framework 3.5相对应的VS2005会升级成VS2008吗