V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cobbage
V2EX  ?  程序员

我想在 Linux 下给 paddleocr 添加个自定义函数编译成 so 供其他程序调用该怎么处理

  •  
  •   cobbage · 73 天前 via Android · 852 次点击
    这是一个创建于 73 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    源代码可执行已经编译成功了。我是搞 java 的想在 linux 下编译成类似 win 下的 dll 的 so 。希望给个处理的步骤。
    6 条回复  ?  2024-03-01 21:42:30 +08:00
    Haku
        1
    Haku  
       72 天前
    建议看看我的这个问题,形式不同但是方法是一致的。
    /t/1003544
    crackhopper
        2
    crackhopper  
       72 天前
    我印象里,没有 main(当然动态库也有自己的 main),加上编译上带有--shared ,输出是 so ,就会形成动态库。其他主要就是写 makefile, cmake 之类的。好久没写了,我当年一般用 cmake 多一些,这样编译器标签什么的,基本都构建系统给你处理好了。就只需要项目编译组织对了就行,正确的添加好依赖,然后构建;一般项目应该都做好这些依赖的 link 配置了,当然 linking 出问题会比较麻烦,又很多细节,我也不展开说了,你可以先试试。
    此外,.so 里面函数签名也有可能是麻烦的点,如果为了更好被别的语言调用,C 的封装接口更加易用一些( C++的 mangling 可能会导致查找符号上还挺困难的,但是如果项目本身是 C++的你会发现封装一层 C 接口也有不少工作量)。另一个常见做法是,在项目中添加比如 java 语言的头文件,然后对相关调用当前 java 提供的 native 函数进行封装,这样会直接导出 java 可有识别的函数。(我推测大概率可以,其他语言都有类似做法) java 的调用技术,应该叫 jni ?你可以自己多研究研究。我对 java 不太熟,只停留在表面使用。
    LiaoMatt
        3
    LiaoMatt  
       72 天前
    网络, JNI, JNA; 还有就是直接在 Java 里面起新进程调用可执行文件, 等到结束后在去读生成的文件
    cobbage
        4
    cobbage  
    OP
       71 天前
    @LiaoMatt 用的是 JNA ,demo 可以了
    cobbage
        5
    cobbage  
    OP
       71 天前
    @crackhopper demo 可以了
    cobbage
        6
    cobbage  
    OP
       71 天前
    @Haku demo 可以了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1049 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:25 · PVG 03:25 · LAX 12:25 · JFK 15:25
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com