精华内容
下载资源
问答
  • NumPy是科学计算方面的一个Python库...对于初次接触NumPy的新手来说,从源码编译安装依赖外部库的NumPy通常不是一个简单的任务。 事实上,NumPy这个Python包本身不需依赖任何第三方库就能完成编译和安装使用,只不过其

    NumPy是科学计算方面的一个Python库,在数据挖掘或机器学习或科学统计等领域经常被用到,官网在这里
    在实际业务中,为发挥NumPy的高性能,在编译NumPy时会依赖一些经过特别优化的第三方科学计算库。对于初次接触NumPy的新手来说,从源码编译安装依赖外部库的NumPy通常不是一个简单的任务
    事实上,NumPy这个Python包本身不需依赖任何第三方库就能完成编译和安装使用只不过其计算性能会受到影响
    本篇笔记记录的是如何在不依赖外部库的情况下来编译使用NumPy,这样做为了理清NumPy与第三方库的关系(相信很多NumPy初学者会分不清NumPy和几个生僻第三方库的关系,以为没有第三方库就不能编译使用NumPy)。

    备注1:下面关于NumPy包的安装过程是借助virtualenv在一个隔离的Python环境下实验的,所以,假定我们已经通过"virtualenv numpy-env"命令创建并通过activate操作进入了隔离环境。
    备注2:本篇笔记用到的gcc版本是gcc version 3.4.5,很旧的版本,不过依然可以编译最新版的NumPy v1.9.2。

    1. 高性能NumPy包通常会依赖LAPACK和ATLAS库
    lapack和atlas是科学计算领域的两个针对线性代数运算的经过特别优化的非常强大的工具库,关于它们的说明,可以分别查看lapack官网atlas官网的说明。
    经常与这两个库一起出现的还有个BLAS库,其官网在这里
    关于这3个库之间的关系,可以参考StackOverflow的这篇问答贴What is the relation between BLAS, LAPACK and ATLAS

    2. 如何不依赖第三方计算库编译NumPy
    根据NumPy官方文档Building and installing NumPy在Building from source部分关于Linear Algebra libraries的说明,这两个库对于安装NumPy包来说并不是强制依赖的。
    下面就是不依赖lapack和atlas库的情况下,源码编译/安装NumPy包的步骤。
    从官网下载NumPy源码(以最新版numpy-1.9.2.tar.gz为例),解压并cd至解压目录后,可以通过下面的方法安装未经优化的NumPy库:
    $ export BLAS=None
    $ export LAPACK=None
    $ export ATLAS=None
    $ python setup.py build > bld.log
    $ python setup.py install
    编译/安装完成后,可以这样来验证:
    >>> import numpy
    >>> numpy.__version__
    '1.9.2'
    复杂点的例子:
    >>> import numpy as np        
    >>> from numpy.linalg import *
    >>> 
    >>> a = np.array([[1.0, 2.0], [3.0, 4.0]])
    >>> print a
    [[ 1.  2.]
     [ 3.  4.]]
    >>> a.transpose()
    array([[ 1.,  3.],
           [ 2.,  4.]])
    >>> inv(a)
    array([[-2. ,  1. ],
           [ 1.5, -0.5]])
    可见,不依赖任何第三方计算库的NumPy确实是可以正常使用的。

    3. 不依赖第三方计算库对NumPy有何影响
    目前为止,虽然确实成功编译并能正常使用NumPy,但仔细查看编译过程输出的bld.log日志文件,可以发现这样一段提示:

    building extension "numpy.linalg.lapack_lite" sources
    creating build/src.linux-x86_64-2.7/numpy/linalg
    ### Warning:  Using unoptimized lapack ###
      adding 'numpy/linalg/lapack_litemodule.c' to sources.
      adding 'numpy/linalg/lapack_lite/python_xerbla.c' to sources.
      adding 'numpy/linalg/lapack_lite/zlapack_lite.c' to sources.
      adding 'numpy/linalg/lapack_lite/dlapack_lite.c' to sources.
      adding 'numpy/linalg/lapack_lite/blas_lite.c' to sources.
      adding 'numpy/linalg/lapack_lite/dlamch.c' to sources.
      adding 'numpy/linalg/lapack_lite/f2c_lite.c' to sources.
    building extension "numpy.linalg._umath_linalg" sources
    ### Warning:  Using unoptimized lapack ###
      adding 'numpy/linalg/umath_linalg.c.src' to sources.
      adding 'numpy/linalg/lapack_lite/python_xerbla.c' to sources.
      adding 'numpy/linalg/lapack_lite/zlapack_lite.c' to sources.
      adding 'numpy/linalg/lapack_lite/dlapack_lite.c' to sources.
      adding 'numpy/linalg/lapack_lite/blas_lite.c' to sources.
      adding 'numpy/linalg/lapack_lite/dlamch.c' to sources.
      adding 'numpy/linalg/lapack_lite/f2c_lite.c' to sources.
    conv_template:> build/src.linux-x86_64-2.7/numpy/linalg/umath_linalg.c
    其中,"Warning:  Using unoptimized lapack"表明编译numpy相关的线性代数库(linalg)时,所依赖的lapack函数库是NumPy源码自带的一份未经优化的实现。
    几点说明如下:
    1) 查看numpy-1.9.2/numpy/linalg目录下的源码可看到,lapack_litemodule.c文件是NumPy为Python实现的C语言扩展库的“接口”文件,该文件定义了一系列Python与C交互的接口函数。写过Python C扩展的话,应该很容易就能看出来,这里不赘
    2) linalg/lapack_lite目录下的几个C文件是NumPy自带的未经优化的线性代数算法的实现文件
    3) 安装前将BLAS/LAPACK/ATLAS几个环境变量export为None后,NumPy的setup脚本就不会尝试在其它路径下搜索这几个库的优化版本,此时,编译脚本会用自带的linalg/lapack_lite目录下的未优化实现编译出动态库lapack_lite.so供上层的Python应用程序调用

    总之,NumPy是否依赖lapack和atlas库,主要影响的是其性能,其功能不受影响
    另外,在实际开发环境中,用到Numpy的地方通常也会用到SciPy,而SciPy是必须依赖lapack和atlas库的,所以,实际项目中使用的NumPy库通常会依赖lapack和atlas。
    而从源码编译依赖lapack和atlas库的numpy库通常需要一些注意事项,下篇笔记将会给出说明。

    【参考资料】
    1. NumPy官网 
    2. LAPACK官网
    3. ATLAS官网 
    4. BLAS官网 
    5. StackOverflow - What is the relation between BLAS, LAPACK and ATLAS  
    6. Building and installing NumPy  
    7. SciPy.org - Building From Source on Linux 

    ====================== EOF ======================


    展开全文
  • 为构建创建一个文件夹并在其中使用CMake,确保链接到它抱怨所有,特别是GLFW,这是项目主要依赖项。 编译器使用方法因编译器而异。 这是一个Linux示例: cd opengl-study/ mkdir build cd build/ cmake ....
  • Qt静态编译 -- 动态链接搜索路径

    千次阅读 2019-02-24 22:59:06
    陌 上 花 开 由一个问题引出静态编译Qt的必要: 如何在一个系统中编译得到一个qt可执行程序,然后,可以拿到另一个...一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Q...

                                                                           陌 上 花 开


    由一个问题引出静态编译Qt的必要: 如何在一个系统中编译得到一个qt可执行程序,然后,可以拿到另一个没有安装qt的系统(同型号)中可以直接运行?

    一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的。会提示缺少xx库文件之类的错误, 这是动态编译的结果, 即在编译你的qt代码时使用的是动态编译方式。   若要想静态编译,则需要安装静态编译的qt,可以参考:

    https://www.cnblogs.com/lvdongjie/p/7248198.html?utm_source=itdadao&utm_medium=referral

    https://blog.csdn.net/qq_37468954/article/details/76537829  

     


    实例:探索qt程序运行时,动态链接库的搜索路径:

    将qt11安装在目录/opt/Qt5.11.1/, 自己在qt creator下编译的程序可以正常执行。然后,手动改安装目录的名字,将Qt5.11.1文件夹名字改为Qt5.11.1C,然后,之前可以执行的qt程序不能执行了,报错:

    原因分析:

    编译程序时,采用的动态编译,而且,qmake生成的makefile文件中使用了g++ rpath选项来指定运行时的搜索路径为/opt/Qt5.11.1/5.11.1/gcc_64/lib,程序执行时需要加载动态链接库,会首先从g++ rpath指定的这个路径去搜索,但是该了名字之后该路径不存在了,于是从系统默认的动态链接库目录(例如/usr/lib)中去搜索,结果从/usr/lib/x86_64-linux-gnu/目录中搜索到了,例如libQt5Widgets.so.5,但是这个链接库对应的是低版本的qt库(可能系统自带的或以前在系统中安装过)(参考本文后半ldd部分),于是提示了上述的错误!

    关于linux搜索动态链接库的方法,可以参考我的:https://blog.csdn.net/qq_35865125/article/details/87868653

    ####################

    使用ldd命令可以查看可执行文件依赖那些动态连接库:

    更改了安装目录名字之后,执行ldd 文件名,会报错,找不到qt相关的库:

    正常时会显示:

    在 ldd 命令打印的结果中,“=>”左边的表示该程序需要连接的动态连接库的名称(这些库的名字信息应该是编译程序的时候保存到可执行文件里面的),右边表示由 Linux 找到的对应的库文件在文件系统中的具体位置。

    ld-linux.so是专门负责寻找库文件的库。以cat为例,cat首先告诉ld-linux.so它需要libc.so.6这个库文件,ld-linux.so将按一定顺序找到libc.so.6库再给cat调用。那ld-linux.so又是怎么找到的呢?其实不用找,ld-linux.so的位置是写死在程序中的,gcc在编译程序时就写死在里面了。Gcc写到程序中ld-linux.so的位置是可以改变的,通过修改gccspec文件。

    上面出错的信息是为什么?经查看,在系统的usr/lib/x86_64-linux-gnu/目录下存在对应的qt的动态链接库文件(可能系统自带的或以前在系统中安装过),这个目录下的动态链接库文件与qt安装目录下的动态链接库文件有什么区别?:

    以libQt5Core.so.5文件为例子,在Qt的安装目录下/opt/Qt5.11.1/5.11.1/gcc_64/lib中:

    可知,其为一个链接文件。

    在usr/lib/x86_64-linux-gnu/目录下:

    可知,在两个目录下libQt5Core.so.5都是一个链接,只是指向的文件不同,  usr/lib/x86_64-linux-gnu/中的链接指向了qt5.2版本,可能之前安装过qt5.2,或者系统自带,所以出错。

     

    另外,更改了qt的安装目录文件名后,更新/etc/ld.so.conf.d/,在这个目录下增加一个conf文件,包含新的路径就可以找到qt的库了,即告诉系统一个新的动态链接库搜索路径。

     


     

    动态链接库介绍:

    https://www.cnblogs.com/Anker/p/3527677.html

    https://blog.csdn.net/qq_35865125/article/details/80668506

    https://cloud.tencent.com/developer/article/1166353

    展开全文
  • 我们很多c程序在windows下是以dll形式展现,在linux则是以so 形式展现。 windows一般不会因为编译dll文件编译器版本不同而出先dll文件不能执行。 但是linux下,不同版本内核linux下编译的... 那我们如何

      我们很多c程序在windows下是以dll形式展现的,在linux则是以so 形式展现的。

      windows一般不会因为编译dll文件的编译器版本不同而出先dll文件不能执行。

      但是linux下,不同版本内核的linux下编译的c程序,在其他版本的linux下就容易出现无法执行的问题。主要可能是支持程序的内核相对于编译时的内核较高或者版本相对于编译时的内核较低。

      那我们如何看别人给我们提供的动态链接库文件(so后缀的)是否能在当前linux系统下可用呢。首先我们就要看他依赖的相关文件是否存在,查看命令如下:ldd file.so

    假如我想看jnative的动态链接库在某个版本的linux下是否被支持,先切换到文件所在目录,然后写下如下命令:

     ldd libJNativeCpp.so

     如果正常,显示如下:

             libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x0069c000)
            libm.so.6 => /lib/tls/libm.so.6 (0x00111000)
            libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00562000)
            libc.so.6 => /lib/tls/libc.so.6 (0x00134000)
            /lib/ld-linux.so.2 (0x0097b000)
     如果不正常可能显示如下:

    ./libJNativeCpp.so: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by ./JNativeCpp.so)
            libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x0047e000)
            libm.so.6 => /lib/tls/libm.so.6 (0x00111000)
            libc.so.6 => /lib/tls/libc.so.6 (0x0056e000)
            libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00c3d000)
            /lib/ld-linux.so.2 (0x0097b000)

    这里是那个有名的jni第三方类库的默认的lib,上边的错误信息显示就是说我们的libJNativeCpp.so是在2.4内核下编译的,当前内核版本不支持。经过查看,我当前的linux版本的内核是2.6高于libJnativeCpp.so编译时的内核。

     

    展开全文
  • 请问有没有什么工具能分析一下各个class之间的依赖关系,把程序里没有用到的库中的class给删掉? 学习了`以前也做过类似的,不过我是手动删除没用到的jar包。 我想说的是JAR包少了程序不能多运行多了的话...

    我的程序里用了很多库(*.jar),但是往往只用到库中的部分内容。请问有没有什么工具能分析一下各个class之间的依赖关系,把程序里没有用到的库中的class给删掉?

    学习了`以前也做过类似的,不过我是手动删除没用到的jar包。

    我想说的是JAR包少了程序不能多运行多了的话还是可以跑跑的!

    这个不太好区分。如果手动区分会碰到这样的问题,如果你引用的class文件,它又引用了库中的别的文件。这样就可能会出错。你的需要反编译一个一个去排除。

      不知道是否有这样的工具。
    一个jar就几百K,何必呢,完全是吃力不讨好?

    有些jar根本就没办法分清依赖关系,比如在一个接口包,名为a-api.jar,一个实现jar:a-impl.jar,在a-api.jar中有一个配置文件,或者通过path进行配置,动态读取类名,反射调用具体实现,此时此刻你要移除了a-impl.jar,岂不是出问题了

    好象没有这样的工具。但有一个办法,把所有jar都删除,然后execute,根据产生的错误提示信息,一般是程序找不到运行所需的类。这样一步一步就看出各个类之间的关系了。不过有点麻烦,需要耐心。

    你要是了解每个jar的含义就好办了,直接删除.因为自己做的东西肯定知道用到哪些第三方包了,
    你如果用的是myeclipse的话 Ctrl + O 能列出所有的类,Ctrl + T 能列出所有的类结构~~

    自己找用到的类 及关联的类吧 然后jar buildpath到你的项目中

    使用maven的话
    goal shade:shade
    配置 minimizeJar 为true

    官方不是有文档嘛 先看看官方的描述就知道了这些
    来源:足球直播

    展开全文
  • 我们很多c程序在windows下是以dll形式展现,在linux则是以so 形式展现。 windows一般不会因为编译dll文件编译器版本不同而出先dll文件不能执行。 但是linux下,不同版本内核linux下编译的... 那我们如何
  • 用Python写脚本,小程序可谓非常方便,但它需要有特定的python环境才能运行,因此如果你想在别的电脑上运行时就会出现许多问题,就算已经安装了Python,但版本可能相差较大,且相关的依赖库没有安装,同样不能正常...
  • 用Python写脚本,小程序可谓非常方便,但它需要有特定的python环境才能运行,因此如果你想在别的电脑上运行时就会出现许多问题,就算已经安装了Python,但版本可能相差较大,且相关的依赖库没有安装,同样不能正常...
  • 用Python写脚本,小程序可谓非常方便,但它需要有特定的python环境才能运行,因此如果你想在别的电脑上运行时就会出现许多问题,就算已经安装了Python,但版本可能相差较大,且相关的依赖库没有安装,同样不能正常...
  • 点击上方“程序员共成长”,选择“置顶或者星标”你关注...可以说如果你搞不懂Maven,那么一个多模块项目足以让你头疼,依赖冲突就会让你不知所措,甚至搞不清楚项目是如何运行起来.....OK,博主就曾经被Maven...
  • 一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的。会提示缺少……库文件之类的错误。这就是动态编译的结果。 但是如果我们想编译一个程序,...
  • Linux 下 静态编译Qt程序

    千次阅读 2012-07-30 11:33:06
    一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的。会提示缺少……库文件之类的错误。这就是动态编译的结果。 但是如果我们想编译一个程序,这个...
  • 一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的。会提示缺少……库文件之类的错误。这就是动态编译的结果。但是如果我们想编译一个程序,这个...
  • 一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的。会提示缺少……库文件之类的错误。这就是动态编译的结果。但是如果我们想编译一个程序,这个...
  • ubuntu系统下cmake 编译matlab中mex文件

    千次阅读 2015-05-19 22:47:39
    利用matlab直接编译mex文件时,对于文件数据多工程时,需要列举所有文件,并且要按照依赖关系排序,这些都是直接采用matalb编译mex缺点。 下面通过一个简单加法函数例子,说明如何利用cmake编译生成mex文件。...
  • 组件库的教程不只对 React 适用,其中提到的思想,对大多数通用组件编写都有效。 本篇介绍的全部构建脚本代码都可以在 https://github.com/fex-team/fit/blob/master/scripts 找到。 分散维护 VS 集中...
  • 上一篇文章讲了hyperlpr安装后如何识别图片的车牌,我下午找视频车牌识别的时候发现又入坑了,,,,,原因:安装完hyperlpr的环境以后仅仅只能读取照片,别的功能都不能用,需要进行编译编译之前需要依赖OpenCV...
  • 可以说如果你搞不懂Maven,那么一个多模块项目足以让你头疼,依赖冲突就会让你不知所措,甚至搞不清楚项目是如何运行起来.....OK,博主就曾经被Maven“伤害”过,那么该专题目的就是:彻底搞定Maven!...
  • Linux系统维护中令管理员很头疼就是软件包之间的依赖性了,往往是你要安装 A 软件,但是编译的时候告诉你X软件安装之前需要 B 软件,而当你安装 Y 软件时候,又告诉你需要 Z 了--好不容易安装好 Z ,发现...
  • 前言本章节主要是讲解下如何打包Qt程序。Qt使用自带的windeployqt 处理依赖库生成exe来发布软件。准备exe1.程序要想发布,在编译器编译一定要选择“release”而不是“debug”,...将 exe 复制到 别的文件夹下(方便整...
  • 前言本章节主要是讲解下如何打包Qt程序。Qt使用自带的windeployqt 处理依赖库生成exe来发布软件。准备exe1.程序要想发布,在编译器编译一定要选择“release”而不是“debug”,...将 exe 复制到 别的文件夹下(方便整...
  • 编译器紧凑,不依赖任何第三方。 它在解析源文件时一次性生成Java字节码。 尽管为堆栈机生成代码很简单,但是复杂类文件格式以及考虑到Java语言设计JVM事实使这一任务更加恶化。 实际上,JVM缺少支持Oberon...
  • 您还可以分叉该项目,并根据自己对这样注释框架将如何满足您需求看法来开始自己工作。 许可证允许您这样做。 您可以从分叉项目开始,将Vert.x依赖项更改为3.5,使其可以编译(需要一些工作),然后运行...
  • 他坚持响应式设计,各个组件兼顾移动端,平板,桌面浏览器等多个不同屏幕尺寸的场景,你可以使用Vue Human内置自己的移动应用,中后台管理界面或者你想要做的别的事。 资料 参与和改进Human的开发 项目克隆至本地后...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    5.5 在使用非零位模式作为空指针内部表示机器上,NULL是如何定义? 5.6 如果NULL定义成#defineNULL((char*)0),不就可以向函数传入不加转换NULL了吗? 5.7 我编译器提供头文件中定义NULL为0L。为...
  • 库的内建可追溯性 133 6.6.4 不要把二进制包作为构 建的一部分放到版本控制库中 133 6.6.5 “test”不应该让构建失 败 134 6.6.6 用集成冒烟测试来限制 应用程序 134 6.6.7 .net小贴士 135 6.7 小结 135...
  • 持续交付-发布可靠软件系统方法

    热门讨论 2014-03-02 01:32:14
    6.6.3 从二进制包到版本控制库的内建可追溯性 133 6.6.4 不要把二进制包作为构建的一部分放到版本控制库中 133 6.6.5 “test”不应该让构建失败 134 6.6.6 用集成冒烟测试来限制应用程序 134 6.6.7 .NET 小贴士...
  • JNI)一些让人欢欣鼓舞概念,还会了解结合Java 和C时所用API,包括如何加载本地如何使用本地关键字、如何生成JNI头文件,以及方法签名、Java数组与C数组、调用Java方法、产品编译和打包等内容。...

空空如也

空空如也

1 2 3 4 5 6
收藏数 112
精华内容 44
关键字:

如何编译依赖别的库的库