利用setup.py build时出现“ LINK : fatal error LNK1181: can not open file'xx' ”报错-后续疑问待解决

问题背景https://ask.csdn.net/questions/7828130 尚未解决,即
题主在利用setup.py在项目中搭建ConvONets依赖项时,编译时遇到链接报错,无法打开输入文件。

搜索了代码文件中含有m.lib的,发现仅有numpy库下面的distutils库中的compaq.py文件含有m.lib.相关代码:

compilers = ['CompaqFCompiler']
if os.name != 'posix' or sys.platform[:6] == 'cygwin' :
    # Otherwise we'd get a false positive on posix systems with
    # case-insensitive filesystems (like darwin), because we'll pick
    # up /bin/df
    compilers.append('CompaqVisualFCompiler')

class CompaqFCompiler(FCompiler):

    compiler_type = 'compaq'
    description = 'Compaq Fortran Compiler'
    version_pattern = r'Compaq Fortran (?P[^\s]*).*'

    if sys.platform[:5]=='linux':
        fc_exe = 'fort'
    else:
        fc_exe = 'f90'

    executables = {
        'version_cmd'  : ['', "-version"],
        'compiler_f77' : [fc_exe, "-f77rtl", "-fixed"],
        'compiler_fix' : [fc_exe, "-fixed"],
        'compiler_f90' : [fc_exe],
        'linker_so'    : [''],
        'archiver'     : ["ar", "-cr"],
        'ranlib'       : ["ranlib"]
        }

    module_dir_switch = '-module ' # not tested
    module_include_switch = '-I'

    def get_flags(self):
        return ['-assume no2underscore', '-nomixed_str_len_arg']
    def get_flags_debug(self):
        return ['-g', '-check bounds']
    def get_flags_opt(self):
        return ['-O4', '-align dcommons', '-assume bigarrays',
                '-assume nozsize', '-math_library fast']
    def get_flags_arch(self):
        return ['-arch host', '-tune host']
    def get_flags_linker_so(self):
        if sys.platform[:5]=='linux':
            return ['-shared']
        return ['-shared', '-Wl,-expect_unresolved,*']

class CompaqVisualFCompiler(FCompiler):

    compiler_type = 'compaqv'
    description = 'DIGITAL or Compaq Visual Fortran Compiler'
    version_pattern = (r'(DIGITAL|Compaq) Visual Fortran Optimizing Compiler'
                       r' Version (?P[^\s]*).*')

    compile_switch = '/compile_only'
    object_switch = '/object:'
    library_switch = '/OUT:'      #No space after /OUT:!

    static_lib_extension = ".lib"
    static_lib_format = "%s%s"
    module_dir_switch = '/module:'
    module_include_switch = '/I'

    ar_exe = 'lib.exe'  # 如果不是win32
    fc_exe = 'DF'

    # 怀疑有问题的一段
    if sys.platform=='win32':
        from numpy.distutils.msvccompiler import MSVCCompiler

        try:
            m = MSVCCompiler()
            m.initialize()
            ar_exe = m.lib   # 出现m.lib
        except DistutilsPlatformError:
            pass
        except AttributeError as e:
            if '_MSVCCompiler__root' in str(e):
                print('Ignoring "%s" (I think it is msvccompiler.py bug)' % (e))
            else:
                raise
        except IOError as e:
            if not "vcvarsall.bat" in str(e):
                print("Unexpected IOError in", __file__)
                raise
        except ValueError as e:
            if not "'path'" in str(e):
                print("Unexpected ValueError in", __file__)
                raise

    executables = {
        'version_cmd'  : ['', "/what"],
        'compiler_f77' : [fc_exe, "/f77rtl", "/fixed"],
        'compiler_fix' : [fc_exe, "/fixed"],
        'compiler_f90' : [fc_exe],
        'linker_so'    : [''],
        'archiver'     : [ar_exe, "/OUT:"],
        'ranlib'       : None
        }

    def get_flags(self):
        return ['/nologo', '/MD', '/WX', '/iface=(cref,nomixed_str_len_arg)',
                '/names:lowercase', '/assume:underscore']
    def get_flags_opt(self):
        return ['/Ox', '/fast', '/optimize:5', '/unroll:0', '/math_library:fast']
    def get_flags_arch(self):
        return ['/threads']
    def get_flags_debug(self):
        return ['/debug']

if __name__ == '__main__':
    from distutils import log
    log.set_verbosity(2)
    from numpy.distutils import customized_fcompiler
    print(customized_fcompiler(compiler='compaq').get_version())

发现我的sys.platform==win32,因此会进入代码的if中,令ar_exe=m.lib,所以程序判断需要m.lib.
但是,我装的VS2017里的msvc中x64或x86文件夹(例如F:\VS2017\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x86)对应的都只有lib.exe,没有m.lib,所以可能无法载入?

所以综上我认为是安装的VS2017的MSVC编译工具和我的Python环境(sys似乎是python解释器的配置参数?)不匹配,不知道对不对,应该怎么解决呢?是重装VS吗?求指点!谢谢。

参考链接

成功解决LINK : fatal error LNK1181: 无法打开输入文件“avdevice.lib” error: command 'D:\\Program Files (x86)\\Micr_一个处女座的程序猿的博客-CSDN博客 成功解决LINK : fatal error LNK1181: 无法打开输入文件“avdevice.lib” error: command 'D:\\Program Files (x86)\\Micr目录解决问题解决方法解决问题在进行av-6.2.0>python setup.py build develop安装的时候遇到的bug。run... https://blog.csdn.net/qq_41185868/article/details/103890466?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166778392316782388017807%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166778392316782388017807&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-103890466-null-null.nonecase&utm_term=%E5%88%A9%E7%94%A8setup.py%20build%E6%97%B6%E5%87%BA%E7%8E%B0%E2%80%9C%20LINK%20%3A%20fatal%20error%20LNK1181%3A%20can%20not%20open%20filexx%20%E2%80%9D%E6%8A%A5%E9%94%99-%E5%90%8E%E7%BB%AD%E7%96%91%E9%97%AE%E5%BE%85%E8%A7%A3%E5%86%B3&spm=1018.2226.3001.4450

img

应该是你环境的问题,我在conda里面执行并没有报错,只是警告说后续会去掉这部分内容而已。
而且conda我记得默认是vs2015的vcruntime,你这个换成2017的也可能出现问题。而且vs的话一般是默认安装到C盘,然后路径不需要手动添加的。
我的建议是,按照项目的install方法来,你估计前面少安装了一些什么东西

问题已解决,原因是windows系统缺少linux工具libm,如果py文件调用到['m'],就会引发LINK1181 error。
解决方法:注释掉项目文件里面所有调用到['m']的代码,再运行试试。(但有可能会引发其他问题,还是建议在linux系统上做)