精华内容
下载资源
问答
  • python下编译py成pyc和pyo (文件加密)需要注意的是,编译成pyc或者pyo文件后需要将命名改成与源Python命名一致,将其放在源目录下,虽然其他python文件调用pyd时显示不能检测到该模块,但实际上可以运行。...

    python下编译py成pyc和pyo (文件加密)

    需要注意的是,编译成pyc或者pyo文件后需要将命名改成与源Python命名一致,将其放在源目录下,虽然其他python文件调用pyd时显示不能检测到该模块,但实际上可以运行。

    由于pyc的编译收到python版本的影响,所以当将编译后的pyc迁移到另一台电脑中时,最好保持python环境一致。

    将python文件.py编译成pyc二进制文件:

    python -m py_file.py

    或者通过脚本运行

    import py_compile ##单个文件编译

    import compileall ##多个文件编译

    py_compile.compile('path') ##path是包括.py文件名的路径

    将python文件编译成pyo二进制文件:

    python -O -m py_file.py

    pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。

    注意事项:pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的 python是无法执行的。 什么是pyo文件? pyo是优化编译后的程序 python -O 源文件即可将源程序编译为pyo文件

    什么是pyd文件?

    pyd是python的动态链接库。windows上为pyd文件,Linux上为so文件,pyd文件实际就是dll文件 编译成pyd的方法如下:

    命令行下:(在项目目录下打开命令行或者shell,该命令只能编译一个文件,编译之后会发现出现三个文件,yourmod.c、yourmod.html、yourmod-win_amd64.pyd,此时将c、html和原py文件删除,将pyd文件命名更改为yourmod就可以)

    cythonize -a -i yourmod.pyx

    python代码:(在原项目中编写setup.py文件)

    from distutils.core import setup from Cython.Build import cythonize import os

    ''' 该文件的执行需要的在Terminal中输入 python setup.py build_ext --inplace !!! 使用Cpython 编译python文件,关键函数编译成pyd文件(相当于dll) '''

    针对多文件情况设置,单文件就只写一个就行

    key_funs = ["yourmod1.py", "yourmod2.py", "yourmod3.py"]

    setup(

    name="XX app",

    ext_modules = cythonize(key_funs), )

    ''' 1、将编译后的pyd文件的命名更改成与原py文件一致 2、删除编译后得到的c文件和原py文件 '''

    print("——————", os.getcwd(), "——————")

    files = os.listdir(os.getcwd()) print(files)

    for fi in files: if fi.contains(".pyd"): re_name = fi.split(".")[0] + ".pyd" print(re_name) os.rename(fi, re_name) elif fi.contains(".c") or fi in key_funs: os.remove(fi)

    运行方式 在原目录的命令行下执行

    python setup.py build_ext --inplace

    展开全文
  • Linux下调用so

    2014-07-24 16:10:54
    开发中通常需要模块化设计,因此通常独立的功能会在单独的模块中实现,在widnows下通常实现为dll,而在linux下则封装成so库,我们来看一下在ubuntu下怎么调用so库。以下代码与操作在ubuntu12.04上实现。 首先编写...

    开发中通常需要模块化设计,因此通常独立的功能会在单独的模块中实现,在widnows下通常实现为dll,而在linux下则封装成so库,我们来看一下在ubuntu下怎么调用so库。以下代码与操作在ubuntu12.04上实现。

    首先编写一个简单的so

     

     

    int hello_add(int a, int b)

    {

        return a + b;

    }

    然后将它编译成.so文件:

    $ gcc -O -c -fPIC -o hello.o hello.c

    $ gcc -shared -o libhello.so hello.o

    放到系统库中:

    # cp libhello.so /usr/local/lib

    # sudo ldconfig

    在这里说明一下,之前的linux系统的用户动态库目录设置好像是在/etc/ld.so.conf.d/local.conf文件中,而在我使用的ubuntu12.04中是在/etc/ld.so.conf.d/libc.conf这个文件中,而且默认已设置为/usr/local/lib这个目录,将我们的so文件放到这个目录后,需用ldconfig命令使其生效。

    下面我们写个test程序来验证一下:

     

    #include <stdio.h>

    int main()

    {

        int a = 3, b = 4;

        printf("%d + %d = %d\n", a, b, hello_add(a,b));

        return 0;

    }

    编译并执行:

    $ gcc -o hellotest hellotest.c -lhello

    $ ./hellotest

    3 + 4 = 7

    展开全文
  • Java在linux下调用C/C++生成的so文件

    千次阅读 2018-03-05 17:46:40
    Java在linux下调用C/C++生成的so文件CplusUtil.java是java web工程中的一个工具类CplusUtil.java 内容如下:package cn.undoner.utils; /** * Created by ${&lt;A HREF="mailto:undoner@gmail.com"&...

    Java在linux下调用C/C++生成的so文件

    CplusUtil.java是java web工程中的一个工具类

    CplusUtil.java 内容如下:

    package cn.undoner.utils;
    
    /**
     * Created by ${<A HREF="mailto:undoner@gmail.com">undoner</A>} on 16-2-25.
     */
    public class CplusUtil {
    
        public native void sayHello();
    
        static{
            System.out.println(System.getProperty("java.library.path"));
            System.load("/usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so");
        }
    
        public static void main(String[] args){
            CplusUtil h = new CplusUtil();
            h.sayHello();
        }
    }
    

    生成相应class文件

    可通过IDE工具(Eclipse/IntellJ/javac等)编译整个工程,生成相应class文件 本文路经为:

    /工程名/target/classes/cn/undoner/utils/CplusUtil.class
    

    添加.h文件

    为utils所需调用的c函数生成相应.h头文件

    注意:在有包名情况下,生成.h头文件要记得带上包名路径

    javah -classpath classes -jni cn.undoner.utils.CplusUtil
    

    生成文件:cn_undoner_utils_CplusUtil.h 内容如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class cn_undoner_utils_CplusUtil */
    
    
    #ifndef _Included_cn_undoner_utils_CplusUtil
    #define _Included_cn_undoner_utils_CplusUtil
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     cn_undoner_utils_CplusUtil
     * Method:    sayHello
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello
      (JNIEnv *, jobject);
    
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    编写c函数

    文件:MyJni.c 内容如下:

    #include <jni.h>
    #include "cn_undoner_utils_CplusUtil.h"
    #include <stdio.h>
    
    JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello(JNIEnv *env,jobject obj){
        printf("Hello JNI");
        return;
    }
    

    编译.c文件

    将.c文件编译成.o,再重新转换成.so或者.dll文件

    gcc -fPIC -D_REENTRANT -I /usr/lib/jvm/java/include -I /usr/lib/jvm/java/include/linux -c MyJni.c
    

    生成文件:MyJni.o

    将.o文件编译成.so文件

    gcc -shared MyJni.o -o MyJni.so
    

    生成文件:MyJni.so

    本文MyJni.so路径为:

    /usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so
    

    执行CplusUtil.class

    在ide中运行CplusUtil或者直接java命令执行:

    java cn.undoner.utils.CplusUtil
    

    结果

    /usr/lib/jvm/java/jre/lib/amd64/server:
    /usr/lib/jvm/java/jre/lib/amd64:
    /usr/lib/jvm/java/jre/../lib/amd64:
    /home/vobile/java_tool/idea-IU-141.178.9/bin::
    /usr/java/packages/lib/amd64:
    /usr/lib64:
    /lib64:
    /lib:
    /usr/lib
    Hello JNI
    

    注:System.getProperty("java.library.path")输出以下信息为本机的lib路径:

    /usr/lib/jvm/java/jre/lib/amd64/server:
    /usr/lib/jvm/java/jre/lib/amd64:
    /usr/lib/jvm/java/jre/../lib/amd64:
    /home/vobile/java_tool/idea-IU-141.178.9/bin::
    /usr/java/packages/lib/amd64:
    /usr/lib64:/lib64:
    /lib:/usr/lib
    

    简化调用linux下Java调用so文件。需要注意以下几点:

    1. 在linux下调用的so文件的格式必须是linux的,而不是x86或其他。

    2. linux打包的so文件的位数必须和本机JVM的位数一样,都是32位或都是64位,JVM位数可以通过java -version查看。如果位数不一致就会报以下错误:wrong ELF class: ELFCLASS64 (Possible cause: architecture word width mismatch) http://www.yanzuoguang.com:9000/upload/2017/11/sn2q6bsk58hb2rh9cb6mvmu3bd.png

    3. so包path要配置好。如果没配置好就会报以下错误:java.lang.UnsatisfiedLinkError: no *** in java.library.path http://www.yanzuoguang.com:9000/upload/2017/11/6gshbosr44h8uohu2tidquf120.png

    可以用 System.out.println("java.library.path:"+System.getProperty("java.library.path")) 来看path是什么。出现错误的原因是java path中找不到so包。解决办法有2个。 a. 把so包cp到对应的path中。 b. 在命令行中定义so包的path。

    export LD_LIBRARY_PATH=/**/*/** (so所在的目录)
    

    只在当前shell下有效... 4. 开始使用了,在JAVA开头中load一下。

    System.loadLibrary("stockocr"); 
    

    so文件的全名是libstockocr.so。注意linux下load时需要去掉lib和so。

    展开全文
  • 这里一个程序源码来说明:#include #... // 定义函数指针,用来接受so文件里的函数,so文件里的函数原型需要一个int参数,返回一个int值void *FuncLib; // 存放动态链接库的句柄char *pcError = NULL; // 存放错误

    这里用一个程序源码来说明:

    #include <iostream>
    #include <dlfcn.h>

    using namespace std;

    typedef int (*Func)(int);  // 定义函数指针,用来接受so文件里的函数,so文件里的函数原型需要一个int参数,返回一个int值

    void *FuncLib;  // 存放动态链接库的句柄

    char *pcError = NULL;  // 存放错误码

    int main(void)
    {
        int iRet = 0;

        // 载入动态链接库,可用相对路径和绝对路径
        FuncLib = dlopen("./libComDll.so", RTLD_LAZY);

        // 获取错误信息
        pcError = dlerror();

        if (pcError)
        {
            cout<<"dlopen Error info:"<<pcError<<endl;
            return -1;
        }

        // 用函数指针承接so文件里的函数,注意ComTest才是so文件源码里的函数名,生成so文件的时候会自动添加__Fi
        Func func = (Func)dlsym(FuncLib, "ComTest__Fi");

        pcError = dlerror();

        if (pcError)
        {
            cout<<"dlsym Error info:"<<pcError<<endl;
            return -1;
        }

        // 执行函数
        iRet = (*func)(-5);

        pcError = dlerror();

        if (pcError)
        {
            cout<<"Func Error info:"<<pcError<<endl;
            return -1;
        }

        cout<<"return value:"<<iRet<<endl;

        // 关闭载入的动态链接库
        iRet = dlclose(FuncLib);

        pcError = dlerror();

        if (iRet)
        {
            cout<<"dlclose Error info:"<<pcError<<endl;
            return -1;
        }

        return 0;
    }


    注意事项:

    1.在编译的时候要添加 -ldl,否则会报错。

     
    展开全文
  • 分为三个部分elf部分,so部分及Android部分 1、elf部分编程 #include <stdio.h> #include <stdlib.h> #include <dlfcn.h> typedef void(*pfnkill)(int);//函数类型指针,这个函数用来结束...
  • 树霉派gcc6.3.0版本dlopen一个4.6gcc版本编译出来的so库,吐血得发现报的错误是no such file or directory,一直以为是我自己打开的方式不对,结果试了下自己写一个.so动态库文件,按照原来调用方法是可以打开的 ...
  • 由于要在linux系统下运行,所以c#中声明如下:[DllImport("test.so", EntryPoint = "run", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr run([MarshalAs...
  • 需要自己定义native方法,编译.h文件,编写c文件,在linux上编译为so文件,巴拉巴拉。。。 总之比较繁琐,而且写java的去写c,你懂得。。。 2.对jni做了封装的JNA方法: 将c中的类型与Java中的类型做了映射,只需要...
  • linux下调用海康sdk

    千次阅读 2019-09-21 22:12:27
    linux下调用海康sdk 1 库文件的配置 方法一:在系统/sur/lib下加入所需的so文件,HCNetSDKCom文件下的so文件也拷贝到/usr/lib目录下。 方法二:①进入/etc/profile 里,将所需so文件的路径添加进去。例如: expot LD...
  • Java在linux下调用C/C++生成的so文件1.CplusUtil.java是java web工程中的一个工具类内容如下:CplusUtil.javapackage cn.undoner.utils;/*** Created by ${undoner} on 16-2-25.*/public class CplusUtil {public ...
  • 编译命令 解决办法: -L. -l库名 要放到.c之后 ...折腾了一个晚上,网上找了半天,才在一个评论里找到的,往其他新手少走弯路 ...另外可以nm工具查看.so .o文件的符号表 要导出的函数名 ...
  • Linux系统下调用动态库(.so) 1、linuxany.c代码如下: #include "stdio.h" void display(char* msg){ printf("%s\n",msg); } int add(int a,int b){ return a+b; } 2、编译c代码,最后生成Python可执行的....
  • Linux下调试core文件的方法

    千次阅读 2018-01-25 18:54:03
    在开发和使用Linux程序时,引擎有时会莫名其妙的core掉,在网上查了一下,整理了一个简单的调试core文件的方法 1、什么是core dump? Core,即core memory, 指由一系列小当纳圈形的磁性材料组成的存储器,这里不过是...
  • [color=#FF0000]生成.so文件 g++ aa.cpp -fPIC -shared -o aa.so 怎么在main.cpp中调用aa.so中的B和C函数?[/color] [color=#339966]//main.cpp[/color] #include <stdio.h> #include <dlfcn.h...
  • 由于这个动态库是新写的,经常有问题需要gdb跟踪代码调试。我要怎么做才能调试这个动态库呢??? 目前想到的一个办法就是再写一个C程序调用这个动态库然后gdb调试。但是这个动态库提供给数据库的接口很多全部...
  • Linux查看.so文件中函数

    万次阅读 2014-12-04 09:43:44
    查看dll中有哪些导出函数windows使用dumpbin,linux使用objdump查看so中有哪些函数。 eg: objdump -tT libX.so 查看dll中符号的地址使用nm。 eg: nm -D libX.so 上面两个命令,如果查看特定的某个函数或者变...
  • Linux下调用海康SDK(java版)

    千次阅读 2019-09-13 17:36:38
    一:配置java项目所需的库文件,库文件的配置分为两种方案 ...2.1: 进入/etc/profile下,将自己java工程需要的so文件的路径:如下 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/aa/java/Linu...
  • linux下调用海康sdk 1.库文件的配置 mkdir /data/hk_sdk/ cd /data/hk_sdk/ 将海康SDK的lib文件夹复制到/data/hk_sdk/下 lib文件下面的结构如图所示: 进入/etc/profile 里,将所需so文件的路径添加到最下面: vi...
  • 在开发和使用Linux程序时,引擎有时会莫名其妙的core掉,在网上查了一下,整理了一个简单的调试core文件的方法 1、什么是core dump? Core,即core memory, 指由一系列小当纳圈形的磁性材料组成的存储器,这里不过是...
  • 我在我的android项目中调用同事给我的在linux下编译好的一个so库,怎么调试都不成功。 后来恍然大悟,同事给我的so库是在X86平台下编译的,android手机都采用ARM平台两个平台的指令集都不一样,当然调用不成功了。...
  • Linux下调用C++源码写PHP扩展

    千次阅读 2017-07-22 15:24:59
    想必有些PHP小伙伴对于写扩展很是头疼,拿我来说吧,完全不懂C++语法,却扔几个C++文件,强行要我去linux下强行编译一个C++静态/动态库(他们C++端也仅仅在windows下测试通过了罢了),无奈,只能硬着头皮上了(实际...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,212
精华内容 1,284
关键字:

linux下调用so文件

linux 订阅