问题背景: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,所以可能无法载入?
应该是你环境的问题,我在conda里面执行并没有报错,只是警告说后续会去掉这部分内容而已。
而且conda我记得默认是vs2015的vcruntime,你这个换成2017的也可能出现问题。而且vs的话一般是默认安装到C盘,然后路径不需要手动添加的。
我的建议是,按照项目的install方法来,你估计前面少安装了一些什么东西
问题已解决,原因是windows系统缺少linux工具libm,如果py文件调用到['m'],就会引发LINK1181 error。
解决方法:注释掉项目文件里面所有调用到['m']的代码,再运行试试。(但有可能会引发其他问题,还是建议在linux系统上做)