gpt4 book ai didi

c++ - 将 Makefile 设置导入 VS2005 IDE

转载 作者:行者123 更新时间:2023-11-30 18:09:48 26 4
gpt4 key购买 nike

我是这个广阔的编程世界的新手。我得到了一些 C 代码,这些代码是使用 makefile 编译和链接的。我可以使用 VS2005 中的 nmake 编译代码。现在我想在 C++ VS2005 IDE 中构建程序。通过Google快速搜索,似乎没有将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 个链接器错误。全部都是 Unresolved external symbol 错误示例:

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

最佳答案

如果我是您,在 IDE 中迁移构建之前我会三思而后行。我知道这对您来说似乎更舒服,但内置的构 build 施确实有限。

Visual Studio 的内置构建系统无法扩展!当你的项目达到一定规模时,它就会成为比其他任何事情都更大的障碍。 Microsoft 认识到这一事实,目前正在插入名为 MSBuild 的替代方案。

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

此时您将有以下选项:

  1. 手动编辑项目文件(文件仍然很多)。
  2. 根据描述生成 Visual Studio 解决方案。
  3. 在 IDE 中集成替代构建系统(如果存在)。
  4. 使用更合适的外部构建系统并从 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

关于c++ - 将 Makefile 设置导入 VS2005 IDE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1067594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com