可以负责任的说,这篇文档是windows10安装pygraphviz中,在中文技术网站中最新的文档,没有之一。是自己完全结合各种问题,包括调试等,总结出来的。

问题来源:主要是可视化RvNN网络的树结构。

pygraphviz安装时,我参考了博文http://www.myexception.cn/perl-python/2046792.html。但是,文章的解决方案已经失效。

已有博文存在的问题:windows下pygraphviz‑1.3.1‑cp34‑none‑win_amd64.whl文件无法适用于python3.6版本

站在巨人的肩膀上。

前述作者在上述博文链接中阐述,windows10下安装pygraphviz要去http://www.lfd.uci.edu/~gohlke/pythonlibs/的地址下载python packages在windows平台上的安装包。

但是,现在这个资源已经404.

其提供的过程就是:先安装graphviz,然后使用如下命令安装pygraphviz

pip install pygraphviz‑1.3.1‑cp27‑none‑win_amd64.whl

很遗憾,虽然网上没有这些资源了,我在csdn上还是找到了如下版本:

可惜,python是3.6,使用这个,依旧安装失败。

因为只在python3.4版本上才能使用。

基于pygraphviz源码包的方式安装

先安装graphviz-2.38.msi文件。是官网上的。

第一个问题:缺失vc14

去官网下载代码。

https://github.com/pygraphviz/

直接python setup.py install,会报出找不到vc14版本的相关错误。

但是信息不够详细。于是,spyder带参数install调试setup.py程序,看究竟是哪一步出了问题。

在spyder console键入:

然后一直跟踪到出错的位置:

调试pygraphviz的setup.py 并且带参数”install” 调试,以后发现,其出错函数在这里:

执行以后会提示:

那么对于这个函数,里面有这样一段说明:

Microsoft Visual C++ 14.0:

Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)

Microsoft Visual Studio 2017 (x86, x64, arm, arm64)

Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)

也就是说:安装对应的即可。

找到了相应的Microsoft Visual C++ 14.0 builder的生成器。但是由于我的电脑安装了vs2015,因此产生冲突。所以,我升级visual studio为2017版本。下载界面在:

https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=Professional&rel=15&rr=https%3A%2F%2Fdocs.microsoft.com%2Fzh-cn%2Fvisualstudio%2Freleasenotes%2Fvs2017-relnotes#

def msvc14_get_vc_env(plat_spec):

"""

Patched "distutils._msvccompiler._get_vc_env" for support extra

compilers.

Set environment without use of "vcvarsall.bat".

Known supported compilers

-------------------------

Microsoft Visual C++ 14.0:

Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)

Microsoft Visual Studio 2017 (x86, x64, arm, arm64)

Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)

Parameters

----------

plat_spec: str

Target architecture.

Return

------

environment: dict

"""

# Try to get environment from vcvarsall.bat (Classical way)

try:

return get_unpatched(msvc14_get_vc_env)(plat_spec)

except distutils.errors.DistutilsPlatformError:

# Pass error Vcvarsall.bat is missing

pass

# If error, try to set environment directly

try:

return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env()

except distutils.errors.DistutilsPlatformError as exc:

_augment_exception(exc, 14.0)

raise

因此,下载Microsoft Visual C++ 14.0并且安装。但是提示Visual studio2015版本和它不兼容。于是,又升级2015版本到2017版本,然后再执行这个程序。成功。这个程序我是从csdn上下载的,后续会放到本文末尾的附件链接当中。

第二个问题:缺失头文件

pygraphviz/graphviz_wrap.c(2987): fatal error C1083: Cannot open include file: 'graphviz/cgraph.h': No such file or directory
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' failed with exit status 2

此时,修改setup.py文件,添加如下代码。这是因为pygraphviz要对一个graphviz_wrap.c文件进行编译,因此就要设置头文件和库文件的包含路径。

注意,实际lib是在release下。

第三个问题:cannot open input file 'cdt.lib'

虽然添加了头文件路径和库文件路径,但是会提示无法打开lib文件。

我们发现,错误是在执行running build_ext时,注意,ext就是extension的意思,也就是在python程序中调用编译器编译C语言的相关文件。

可以看到:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe对文件进行编译的时候,里面已经添加了"-IC:\Program Files (x86)\Graphviz2.38\include"的头文件路径,解决了之前头文件缺失的问题。

但是,在执行后续C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe
即链接所有库,生成可执行程序的时候,却提示无法打开cdt.lib文件,我们看到这里面的寻址路径中并没有之前修改setup.py文件中添加的那句话:

library_dirs=['C:\Program Files (x86)\Graphviz2.38\lib\release\lib']

但是,修改setup.py文件时添加的include_dirs=['C:\Program Files (x86)\Graphviz2.38\include']

确实生效了。

为什么在setup.py中添加library_dirs之后,再调用VC的链接程序,并没有向指定库文件路径下寻找cdt.lib呢?

这是问题的根本所在。启动调试进程,调试setup.py文件。在spyder的console端键入如下:

debugfile('H:/pygraphviz-master-wrong2/setup.py', args='install', wdir='H:/pygraphviz-master-wrong2')

跟踪上图中setup函数中的执行,尤其是对ext_modules的数据处理。跟踪这个数据处理,就能找到哪里引用了include_dirs,哪里引用了library_dirs。

数据就是通道

我们需要找到输出异常的位置,离它越近越好,就像逼近真相。

查看出错时的输出信息,有如下最关键的地方:

  • running build_ext
  • building 'pygraphviz._graphviz' extension

然后跟踪程序执行,会在python的系统文件dist.py中有run_commands的函数

这里面就有running %s的输出。那么我相信关键进程就在cmd_obj.run()中。正是这个执行过程,里面出错。

所以,log.info处下断点,当输出running buid_ext之后,进入run的函数内部:run内部又会跟进到了build_ext.py文件的核心函数run中:

里面会对compiler编译器进行设置,一直到执行self.build_extensions函数。

跟入该函数,

然后,在console端调试:

这里面的extension的命名“pygraphviz._graphviz”和setup.py文件中指定的命名是一致的。

也就是说,到目前为止:

已经找到了对setup.py文件中extension进行处理的核心代码,继续跟踪就会知道library_dirs为什么会失效。

跟踪进入cython_sources函数,就会看到:sources在第一个for循环中正是extension除去名称之后的第一行。

我们在cython_sources中下断点,直到sources是library-dirs的那一行。

可惜,直接一次循环就报出了本文所出现的link.exe链接的错误。

于是,直接跟入build_extension函数,就第一次循环就跟进去:如下,

我们输出可以看到:

我们跟进compile函数,确实没有给library_dirs进行赋值的选项。

继续跟,跟完compile以后,发现compile只是进行了编译操作。

会输出:

ipdb> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD "-IC:\Program Files (x86)\Graphviz2.38\include" -IC:\ProgramData\Anaconda3\include -IC:\ProgramData\Anaconda3\include "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\8.1\include\shared" "-IC:\Program Files (x86)\Windows Kits\8.1\include\um" "-IC:\Program Files (x86)\Windows Kits\8.1\include\winrt" /Tcpygraphviz/graphviz_wrap.c /Fobuild\temp.win-amd64-3.6\Release\pygraphviz/graphviz_wrap.obj

现在,继续在build_extension中跟入:

这个就是链接过程。也就是在python程序中调用c编译器编译c目标程序时,会执行的函数。

我们跟进去。

ipdb> print (ext.library_dirs)
['C:\\Program Files (x86)\\Graphviz2.38\\lib\release\\lib']

这也说明,确确实实是传入进去了。我们进入这个函数:

一直跟到里面的一个link函数时,我们发现有问题!

也就是,传入的library_dirs已经变成了

C:\Program Files (x86)\Graphviz2.38\lib

elease\lib

这是什么鬼!!!

里面有一个_fix_lib_args的操作,但是可以看到:

lib路径已经错了。本来应该是lib\\release\lib的,却变成了libelease\lib了。

然后一直进入到:

self.spawn([self.linker] + ld_args)

我们可以输出如下:

结果这里面输出的ld_args竟然是:

C:\\Program Files (x86)\\Graphviz2.38\\lib\release\\lib'

千万不要以为是正确的地址。正确的是C:\\Program Files (x86)\\Graphviz2.38\\lib\\release\\lib。

我们来观察一下:

ld_args = (ldflags + lib_opts + export_opts + objects + ['/OUT:' + output_filename])

然后ld_args是:

猛地一看,还是错误的。为什么在console端用print(ld_args )输出的是:

C:\\Program Files (x86)\\Graphviz2.38\\lib\release\\lib'

这是因为,你没有双击开。你双击开看到的是:

看到了吗?这是windows下的换行符号\r。在控制台输出的时候变成了\r。

在spyder中查看的时候,是换行。

而实际上:

目前为止,真正传入的就是这么个玩意:

/LIBPATH:C:\Program Files (x86)\Graphviz2.38\lib

elease\lib

也就是说,是换行符号\r。

我们双击点开libopts也是一样的。libopts是构成ld_args的重要组成。所以,后面的就不用跟了。

link程序必然出错。因为找不到cdt.lib文件。所以,link.exe程序必然失败,报出1181错误。

现在已经知道怎么改了,就是把setup.py中路径的反斜杠,全部改为斜杠。但是我不能容忍不知道为什么传递的时候出错。

为什么在某个环节C:\\Program Files (x86)\\Graphviz2.38\\lib\release\\lib

变成了C:\\Program Files (x86)\\Graphviz2.38\\lib\release\\lib

我们会发现是在调用link_shared_object的时候出的错误:

此时调试输出的是:

当跟入函数以后:

所以,错误就是ext.library_dirs生成的过程出错。

那么就要追踪ext.library_dirs是如何依据setup.py文件中的extension项目生成的。

所以,关键是找到调用build_extension函数的地方,并且看是谁把值传入了ext。

现在开始倒推:

    def build_extensions(self):
# First, sanity-check the 'extensions' list
self.check_extensions_list(self.extensions) for ext in self.extensions:
ext.sources = self.cython_sources(ext.sources, ext)
self.build_extension(ext)

在进入这个函数的时候,输出仍然是:

ipdb> print (ext.library_dirs)
['C:\\Program Files (x86)\\Graphviz2.38\\lib\release\\lib']

所以,错误就在于生成self.extensions的过程中就已经注定了。

那么什么时候生成self.extensions的呢?

我们进入check_extensions_list函数,仍旧是输出的是错误的地址。

所以,错误的形成不是在build_extensions中。

而是在调用build_extensions之前,然后生成了self.extensions,里面包含了'扭曲"的地址。

那么就是build_ext类的问题了,因为它就是那个self

我们通过观察build_ext的类结构,和快速的扫描代码,找到了。

它的finalize_options函数中对self.extensions进行了设置。

这个时候,刚刚执行完下面代码:

self.extensions = self.distribution.ext_modules

我们就在console端键入:

可以看出,已经错了。所以,错误的形成不是在self.extensions的生成中。

而是在self.distribution.ext_modules的生成中。于是,进一步倒推。

在build_ext中,并不能找到self.distribution的相关代码。我们发现,build_ext继承的是Command类。Command类中有self.distribution。

所以,我们就要关注于build_ext这个类对象的生成。

这个时候,就要重头开始调试,看哪个地方生成了build_ext这个类的对象引用。

  • 调试到run_command函数内部,下断点,当执行完log.info("running %s", command)以后输出的是running build_ext,我们继续下一步
  •         log.info("running %s", command)
    cmd_obj = self.get_command_obj(command)
    cmd_obj.ensure_finalized()
    cmd_obj.run()

肯定是在上面的三行代码中,完成了对build_ext类的生成,在这里完成了对self.distribution的操作。

首先跟入get_command_obj函数,感觉这个是最有可能对Command子类build_ext类对象的生成过程。因为从名字来看就是get_command_obj,并且注释是:

        """Return the command object for 'command'.  Normally this object
is cached on a previous call to 'get_command_obj()'; if no command
object for 'command' is in the cache, then we either create and
return it (if 'create' is true) or return None.
"""

执行完第一行程序:

cmd_obj = self.command_obj.get(command)

由于之前是有:

self.extensions = self.distribution.ext_modules

所以我们直接在调试console输入:

结果发现:名称已经出错了!!!

那么问题肯定是在self.command_obj.get中了!!!它在生成build_ext类对象的时候,初始化父类Command的distribution成员时,就已经把地址”扭曲“了!!!

最遗憾的是!!!这个self.command_obj.get压根跟入不进去。很有可能代码不是开源的,只是作为功能提供在链接库当中。所以,这是一个bug。

什么bug???

呕血调试发现python的bug

就是在setup.py文件中的extension中写入library_dirs的时候,如果传入如下的地址:

library_dirs=['C:\Program Files (x86)\Graphviz2.38\lib\release\lib'],

那么出于某种原因,python系统,会将\r看作换行符。因此,在转变的过程中:

本来是要将\处理成\\的,但是这个\r被遗漏了。于是就产生了如下“扭曲”的地址

C:\\Program Files (x86)\\Graphviz2.38\\lib\release\\lib

最后,python中编译(setup.py文件中extension指定)的c程序,就会出现找不到库的问题。

于是乎,报告这个bug的同时,建议全部用斜杠/。

提交了bug,和处理结果(被老外狠狠的鄙视了一把,他不认为是bug)

回复:
msg3530 (view) Author: berker.peksag Date: 2018-08-20.16:26:32
remove
> In windows, we always give a path using '\' and python 3 can correctly dispose
> it just as we using '/' in Linux. But if you offer
> a path in windows with a '\' followed as 'r'. Everyting will goes wrong.

You need to use raw strings to avoid this. Replace

"C:\Program Files (x86)\Graphviz2.38\lib\release\lib"

with

r"C:\Program Files (x86)\Graphviz2.38\lib\release\lib"

See https://blog.lerner.co.il/avoiding-windows-backslash-problems-with-pythons-raw-strings/ for more details about raw strings.

This tracker is for issues with bugs.python.org. Please use Stack Overflow or python-list to ask usage questions.

老外不承认是bug。说,windows反斜杠的处理,要加r。嗯嗯。就这样吧。

第四个问题:unresolved external symbol agwrite

解决方案见网址:

https://github.com/pygraphviz/pygraphviz/issues/58

这里面说用64位lib下的库文件覆盖到目录lib下即可。也就是说这些unresolved是缺失了一些库。可以看到是生成_graphviz.cp36_win_amd64.lib的时候出错。这是因为安装的graphviz是32位的模块,缺失了很多库文件。

这个库,会放在本文附件里。

接着问题就能排除。
注意是将我附件中的\GraphViz_x64-master\graphviz-2.38_x64\lib放置到: graphviz的msi安装程序之后的release的lib下面,而不是直接的lib下面C:\Program Files (x86)\Graphviz2.38\lib\release\lib。 但是,仅仅覆盖lib文件时不够的。否则在后续的测试程序中,import pygraphviz的时候回报错提示,dll win32位的有问题。 所以,除了lib路径需要特殊处理以外,需要把附件中GraphViz_x64-master\graphviz-2.38_x64中的 所有的内容全部覆盖到C:\Program Files (x86)\Graphviz2.38中去。(所以,你直接换个名字吧。具体见文末的总结)

倒数第二个问题:unresolved external symbol PyIOBase_Type

仍然是下面的这个网址:

https://github.com/pygraphviz/pygraphviz/issues/58

里面提到:(在网络海量信息中去伪存真)

最后在如下这个网址:

https://github.com/pygraphviz/pygraphviz/issues/74#issuecomment-238323405

中找到:

点击进去(https://github.com/Kagami/pygraphviz/commit/fe442dc16accb629c3feaf157af75f67ccabbd6e)

就是一个补丁文件:

按照补丁文件对graphviz.ipygraphviz/graphviz_wrap.c进行修改(我一行一行对着补丁改的。。。应该有依据补丁的自动化修改工具)。修改后的文件见附件。

最后一个问题,测试程序时输出ValueError: Program neato not found in path。

import pygraphviz as pgv

A=pgv.AGraph()

A.add_edge(1,2)
A.add_edge(2,3)
A.add_edge(1,3) print(A.string()) # print to screen
print("Wrote simple.dot")
A.write('simple.dot') # write to simple.dot B=pgv.AGraph('simple.dot') # create a new graph from file
B.layout() # layout with default (neato)
B.draw('simple.png') # draw png
print("Wrote simple.png")

上面是测试程序。通过搜集资料可知,是因为neato的问题。双击C:\Program Files (x86)\Graphviz2.38\bin下的neato,会报出异常。

如何解决,见文末总结。

附件

链接:https://pan.baidu.com/s/18VKkVj_CupmvFwihdHwH8Q 密码:aqr7

总结,全部安装过程

  1. 安装graphviz-2.38.msi,这是官网提供的graphviz文件,安装位置是:C:\Program Files (x86)\Graphviz2.38\
  2. 安装vc14编译器,在visualcppbuildtools_full中,前提是安装了visual studio2017版本。
  3. pygraphviz-master的setup.py文件中按照前述指导,添加头文件和库文件目录路径。或者直接替换为我附件中提供的setup.py文件
  4. 如果此时直接python setup.py install,会提示很多的 error LNK2001: unresolved external symbol错误。这个时候,是因为安装的graphviz2.38不是64位版本。这个时候,是因为缺少64位graphviz的相关lib文件。(而且截止到目前为止,我都没有在graphviz中找到相关的明确指明为64位的安装包。我提供的64位的目录文件是从github上一个网页提供的资源上下载的)这个时候,我们将C:\Program Files (x86)\Graphviz2.38中的Graphviz2.38直接改为Graphviz2.38_msi,表示这个目录下是原始官网graphviz-2.38.msi安装后的文件目录。
  5. 然后将,附件中的H:\安装包和补丁文件\GraphViz_x64-master\GraphViz_x64-master\graphviz-2.38_x64完全复制到C:\Program Files (x86)下,并且改名为Graphviz2.38,同时将lib目录下的所有文件复制到lib\release\lib目录中。
  6. 此时,再python setup.py install安装会提示:LNK2001: unresolved external symbol PyIOBase_Type。按照前述指导,将附件中我按照前述网址指导的patch修改后的graphviz_wrap.c和graphviz.i文件替换到H:\pygraphviz-master\pygraphviz中去。
  7. 再次运行python setup.py install文件。成功。
  8. 运行前述测试程序。会提示:ValueError: Program neato not found in path。因为我提供的64位的graphviz中没有这个neato文件。事实上,我查了一下,gvplugin_neato_layout.dll文件是有的。唯独缺失neato.exe文件。我直接怀疑是https://github.com/mahkoCosmo/GraphViz_x64/的作者有意而为之。这种事情以前读研的时候遇到,BAP(一个二进制分析平台)的源码,我曾经一直在研究。后来全部源码被下架。实话讲,国内很多项目都是参照国外的开源代码。如果国外搞技术封锁,呵呵。。。。。。
  9. 如何解决?直接将C:\Program Files (x86)\Graphviz2.38_msi\bin写入系统的path变量中。然后重启spyder和Anaconda,即可。
  10. 得到最后的结果。结束。
  11. 有人会问,两个版本的graphviz(即一个国外提供的免安装版本,还一个是官网的版本)并存,会有影响吗?我的解释是,那就看pygraphviz是怎么写的了。但是到目前为止,没有遇到错误。编译和链接pygraphviz中的graphviz_wrap.c文件的时候,需要国外某作者提供的免安装版本的lib文件,官网的有缺失(或者说官网的64位版本能够支持pygraphviz需求的,已经找不到资源)。所以就必须要用国外提供的免安装版本。但是,国外免安装版本中的neato文件又被蓄意删去。这个时候,实际程序运行的过程中,pygraphviz会调用neato文件。因此,我们就把官网graphviz安装包安装后的路径写入到系统Path变量中。这样就能调用其neato程序。
  12. 如果有人还不明白的话,我这样解释吧。假如你只是将GraphViz_x64-master中的lib文件修改到C:\Program Files (x86)\Graphviz2.38中的lib\release\lib目录下,你编译,链接,都不会有问题。但是,你再运行测试程序的时候,直接import pygraphviz都会出错,会提示“DLL 不是有效的win32程序”(注意,win32不是说就是32位。64位也说是win32。)。为什么?这是因为,官网提供的graphviz,安装在64位系统以后,也是32位的模块。而目前压根找不到64位的模块。于是,只好用国外某作者可能蓄意删除neato程序以后的graphviz_x64文件的全部内容。然后再将pygraphviz运行时可能缺失的neato文件用原始msi安装后的neato文件进行补充。
  13. 所以,就是两版本兼容。
  14. 总的来说,pygraphviz很强势。但是为什么做的,连win10 64位下的安装支持的都不够好。原因未知。当哪天突然有人不想开源了,想做成商业化了,我估计这种情况会更多。正如本文最初提到的,连whl文件的地址都失效了。这不是技术封锁,是什么。
  15. 最后,我的附件中提供pygraphviz-1.3.1-cp34-none-win_amd64.whl文件。仅限于win 64位系统,以及python 3.4上使用。我没有实验过。但是python 3.6版本是肯定不行。我相信大部分人不会只为了装一个pygraphviz,而把python降低为3.4版本。

2 pygraphviz在windows10 64位下的安装问题(反斜杠的血案)的更多相关文章

  1. Windows10 64位下安装TensorFlow谷歌人工智能系统已官方原生支持

    Windows10 64位下安装TensorFlow谷歌人工智能系统已官方原生支持 GitHub - tensorflow/tensorflow: Computation using data flo ...

  2. win7 64位下如何安装配置mysql-5.7.4-m14-winx64

    win7 64位下如何安装配置mysql-5.7.4-m14-winx641. mysql-5.7.4-m14-winx64.zip下载 官方网站下载地址:http://dev.mysql.com/g ...

  3. Linux 64位下一键安装scipy等科学计算环境

    Linux 64位下一键安装scipy等科学计算环境 采用scipy.org的各种方法试过了,安装还是失败.找到了一键式安装包Anaconda,基本python要用到的库都齐了,而且还可以选择安装到其 ...

  4. windows(32位 64位)下python安装mysqldb模块

    windows(32位 64位)下python安装mysqldb模块 www.111cn.net 编辑:mengchu9 来源:转载 本文章来给各位使用在此windows系统中的python来安装一个 ...

  5. windows10 64位下安装oracle 11g和PL/SQL Developer

    一.材料准备: oracle11g安装包(64位) oracle11g客户端(32位) PL\SQL Developer安装包(32位) 1.下载Oracle 11g链接:http://www.ora ...

  6. CentOS7 64位下MySQL安装与配置(YUM)

    安装环境:腾讯云CentOS7 64位安装MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum ...

  7. [转]win7 64位下完美安装64位oracle 11g

    最近在网上搜如何在win764位的情况下安装64位的oracle,并且使用PLSQL Developer来管理oracle. 于是开始在oracle官网下载数据库,下载是一件很简单的事情,问题是在百度 ...

  8. win7 64位下 mongodb安装及命令运行

    有网友老催我把框架加上mongodb的支持,于是偶尔抽空看了看相关的文章. 今天有缘,就把mongodb安装了一下,中间遇到了小小的问题,So,把整个过程记录一下: 1:先上官网:http://www ...

  9. ubuntu 14.04 64位 下 编译安装MySQL 5.7.11

    步骤一: 先去mysql的官方网站 去down 编译源码包 mysql 网址:www.mysql.com downloads  (MySQL Community Server) 下载版本选择  sou ...

随机推荐

  1. 关于 maven 打包直接运行的 fat jar (uber jar) 时需要包含本地文件系统第三方 jar 文件的问题

    关于maven打包fat jar (uber jar) 时需要包含本地文件系统第三方jar文件的问题,今天折腾了一整天.最后还是用了spring boot来做.下面是几篇关于打包的有参考价值的文章,以 ...

  2. Mac 10.12原生方法对NTFS分区进行读写的配置

    说明:不一定有效,最简单的方法就是不用NTFS,直接FAT32,对于大文件就用切割. 方法: 1.确定U盘名称 diskutil list ls /Volumes/ 2.比如我找到的U盘名称为Unti ...

  3. Mac 10.12高级防火墙pfctl教程收集(待实践)

    在Mac 10.10之前使用ipfw.之后升级为pfctl.由于Mac自带的GUI防火墙只能针对软件进行放开,且无法针对特定端口入站及出站进行管理.所以使用pfctl能解决这类问题. 收集教程如下: ...

  4. 1、 小白带你入坑xamarin系列之环境搭建和准备

    重点提示 由于xamarin发展更新很快 目前教程部分内容已经过时 请注意下载最新版本   2018.05.23 www.xamarin.com 1. 小白带你入坑xamarin系列之环境搭建和准备 ...

  5. (转)CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup

    CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup 原文:http://qizhanming.com/blog/2017/05/10/install-percona- ...

  6. nuxt.js引入客户端脚本和第三方库出现window/document/ navigator未定义问题

    官方文档中已经给出解决方案: 实际操作也比较简单,比如我之前在项目中引入的wangeditor,这个插件里包含了navigator内容 解决:现在nuxt.config.js的webpack扩展配置中 ...

  7. 全网最详细的Git学习系列之介绍各个Git图形客户端(Windows、Linux、Mac系统皆适用ing)(图文详解)

    不多说,直接上干货! 一.TortoiseGit - The coolest Interface to Git Version Control TortoiseGit 是 TortoiseSVN 的  ...

  8. STL 排序(转载)

    这篇文章关于STL中的排序写的虽不深入,但是还是挺好的. 1.sort sort有两种形式,第一种形式有两个迭代器参数,构成一个前开后闭的区间,按照元素的 less 关系排序:第二种形式多加一个指定排 ...

  9. PHP OOP面向对象部分方法归总(代码实例子)

    <?php//对象名存在栈内存中,数据存在堆内存中class leyangjun{    var $name;  //定义变量    var $age;    var $sex;         ...

  10. IOS7 导航栏适配二

    ios7下的app都是全屏的,意思就是所有控制器的view默认都是从  屏幕的 (0,0)开始. 这时候用到导航栏时,往往会出现被导航栏挡住情况. 最明显的是用到tableView时,第一行的数据会被 ...