Makefile 找不到 *.lib,但已声明路径

Makefile won't find *.lib but path is declared

提问人:user3755529 提问时间:11/15/2023 最后编辑:user3755529 更新时间:11/18/2023 访问量:106

问:

我正在尝试为Autodesk的软件编译插件示例。

这里是 Makefile

##############################################################################
#           Makefile for use by API developers                               #
#                                                                            #
#  NOTE: "vcvarsall amd64" must be run before attempting to compile the API  #
#  examples. Please see the API documentation for information.               #
#                                                                            #
##############################################################################

#
# If the location of the Alias libraries and header files are
# different from $ALIAS_LOCATION, set it here.
#
ALIAS_LOCATION=C:\Program Files\Autodesk\AliasSurface2023.0


CPPEXAMPLES = cppCube.exe

EXAMPLES = $(CPPEXAMPLES)

CC = cl.exe
CPLUSPLUS = cl.exe
LINK = link.exe

INCLUDES = /I. /I"$(ALIAS_LOCATION)\ODS\Common\include" /I"C:\Program Files\Windows Kits\10\Include\10.0.22621.0\ucrt" /I"C:\Program Files\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.37.32822\include"

# 
# Dynamic Linking.
#
EXTRA_LFLAGS = /LIBPATH:"$(ALIAS_LOCATION)\lib";"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64" /VERBOSE
EXTRA_CFLAGS = 
LFLAGS = /nologo /SUBSYSTEM:CONSOLE /NODEFAULTLIB:LIBC.LIB $(EXTRA_LFLAGS) /STACK:0xa00000

#
# Required libraries. 
#
LIBS = libalias_api.lib

STD = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib \
     advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib \
     odbc32.lib odbccp32.lib comctl32.lib netapi32.lib \
     version.lib ws2_32.lib

CLIBS = $(LIBS) $(STD)

CFLAGS = /nologo /MD $(INCLUDES) $(COPIOUS_OUTPUT) $(EXTRA_CFLAGS)
CPLUSPLUSFLAGS = $(CFLAGS)

#
# Rules for building.
#
.SUFFIXES: .c .c++ .obj .cpp

.cpp.obj:
    $(CPLUSPLUS) -c $(CPLUSPLUSFLAGS) $*.cpp

.c.obj:
    $(CC) -c $(CFLAGS) $*.c

#
# Build all the examples.
#
default: $(EXAMPLES)

#
# Copy all the source files for the examples.
#
copy:
    copy "$(ALIAS_LOCATION)\ODS\OpenModel\examples\*.cpp" .
    copy "$(ALIAS_LOCATION)\ODS\OpenModel\examples\*.c" .
    copy "$(ALIAS_LOCATION)\ODS\Common\examples\*.cpp" .
    copy "$(ALIAS_LOCATION)\ODS\Common\examples\*.c" .
    copy "$(ALIAS_LOCATION)\ODS\Common\examples\*.h" .

#
# Clean up.
#
clean:
    del *.obj *.exp *.lib $(EXAMPLES)

#
# Rules for building the executables.

cppCube.exe:            cppCube.obj
    $(LINK) $(LFLAGS) /out:$@ cppCube.obj $(CLIBS)

问题是当我尝试运行时,它找不到上述目录中存在的文件:nmake

$ nmake

Microsoft (R) Program Maintenance Utility Version 14.37.32825.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        link.exe /nologo /SUBSYSTEM:CONSOLE /NODEFAULTLIB:LIBC.LIB /LIBPATH:"C:\Program Files\Autodesk\AliasSurface2023.0\lib";"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64" /STACK:0xa00000 /VERBOSE /out:cppCube.exe cppCube.obj libalias_api.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib  advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib  odbc32.lib odbccp32.lib comctl32.lib netapi32.lib  version.lib ws2_32.lib

Starting pass 1
Processed /DEFAULTLIB:MSVCRT
Processed /DEFAULTLIB:OLDNAMES
LINK : fatal error LNK1181: cannot open input file 'libalias_api.lib'
NMAKE : fatal error U1077: 'link.exe /nologo /SUBSYSTEM:CONSOLE /NODEFAULTLIB:LIBC.LIB /LIBPATH:"C:\Program Files\Autodesk\AliasSurface2023.0\lib";"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64" /STACK:0xa00000 /VERBOSE /out:cppCube.exe cppCube.obj libalias_api.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib  advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib  odbc32.lib odbccp32.lib comctl32.lib netapi32.lib  version.lib ws2_32.lib' : return code '0x49d'
Stop.

我运行收到此消息。$ "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64[vcvarsall.bat] Environment initialized for: 'x64'

我已经安装了Visual Studio Tools并从管理员开发人员命令提示符运行。

犯错者只是抱怨“libalias_api.lib”吗?还是 kernel32.lib?它的措辞模棱两可。

这是我遵循的指南: https://help.autodesk.com/view/ALIAS/2023/ENU/?guid=GUID-D9756922-3960-4FC6-AFFC-940A0A5E8C7F

--- UPDATE 1 --- 安装Windows SDK后,仍然出现LINK错误

C++ Visual-Studio Makefile 编译器错误

评论

0赞 PMF 11/15/2023
为什么标题说找不到“kernel32.lib”,而错误消息却说“libalias_api.lib”?哪一个是你真正的问题?
0赞 user3755529 11/15/2023
它确实存在,两者都分别存在于 /LIBPATH 中指示的两个目录中,但两者都从错误消息中说找不到。我决定将 kernel32.lib 放在标题中,因为它是每个人都知道的东西,而 libalias_api.lib 非常特定于我试图为其构建插件的软件,没有人使用。
1赞 PMF 11/15/2023
Kernel32.lib 应始终位于链接器路径中。如果不是,则编译器安装可能存在一些问题。
0赞 user3755529 11/15/2023
是的,我想我必须重新定义每一个..有什么好的方法可以开始清洁吗?删除所有内容并重新开始的最简单方法是什么?
0赞 Minxin Yu - MSFT 11/16/2023
使用的是 Visual Studio 还是 Visual Studio Code?它们是两种不同的产品。

答:

1赞 MSalters 11/17/2023 #1

不确定在哪里查找或运行vcvarsall

嗯,这就是问题所在。该批处理文件设置环境变量,以便 Visual Studio 组件可以相互查找。在这种情况下,链接器找不到 SDK。

批处理文件位于 Visual Studio 安装目录中。它也可能通过“开始”菜单和 Visual Studio IDE 内部进行访问。

评论

0赞 user3755529 11/17/2023
谢谢我现在运行获取此消息,然后我再次运行,但出现了与之前相同的错误。vcvarsall[vcvarsall.bat] Environment initialized for: 'x64'nmake
1赞 MSalters 11/17/2023
@user3755529:好吧,除了 vcvarsall 查找各种组件之外,您还需要安装组件。找不到不存在的东西。是否安装了当前的 Windows SDK?(或者至少是某个最新版本?
0赞 user3755529 11/17/2023
安装此 developer.microsoft.com/en-us/windows/downloads/windows-sdk 后,我重新启动,重新运行命令并出现相同的错误,我已将最新的尝试添加到问题中。
0赞 user3755529 11/18/2023 #2

所以我认为 Makefile 只是试图将两个 CLI 命令放在一起。

因此,我将这两个命令放在一起,在对如何更正语法进行了一些调查后,我最终设法使用以下 CLI 命令编译了所有内容:

cl /c /I “C:\Program Files\Autodesk\AliasSurface2023.0\ODS\Common\include” cppView.cpp /link “C:\Program Files\Autodesk\AliasSurface2023.0\lib”;“C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64”

link /LIBPATH:"C:\Program Files\Autodesk\AliasSurface2023.0\lib" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64" /out:cppView.exe cppView.obj libalias_api.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib netapi32.lib version.lib ws2_32.lib