V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
cobbage
V2EX  ›  程序员

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

  •  
  •   cobbage · 306 天前 via Android · 1100 次点击
    这是一个创建于 306 天前的主题,其中的信息可能已经有所发展或是发生改变。
    源代码可执行已经编译成功了。我是搞 java 的想在 linux 下编译成类似 win 下的 dll 的 so 。希望给个处理的步骤。
    6 条回复    2024-03-01 21:42:30 +08:00
    Haku
        1
    Haku  
       305 天前
    建议看看我的这个问题,形式不同但是方法是一致的。
    https://www.v2ex.com/t/1003544
    crackhopper
        2
    crackhopper  
       305 天前
    我印象里,没有 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  
       305 天前
    网络, JNI, JNA; 还有就是直接在 Java 里面起新进程调用可执行文件, 等到结束后在去读生成的文件
    cobbage
        4
    cobbage  
    OP
       304 天前
    @LiaoMatt 用的是 JNA ,demo 可以了
    cobbage
        5
    cobbage  
    OP
       304 天前
    @crackhopper demo 可以了
    cobbage
        6
    cobbage  
    OP
       304 天前
    @Haku demo 可以了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1087 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:51 · PVG 02:51 · LAX 10:51 · JFK 13:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.