【问题标题】:Create shared objects using codeblocks?使用代码块创建共享对象?
【发布时间】:2014-10-16 17:27:44
【问题描述】:

我正在尝试学习 JNI,但每次我尝试运行 java 程序时,它都会抛出一个异常,指出它在启动时声明的 lib 路径中找不到 *.so 库 - 这应该发生。我的印象是它不应该,但后来我意识到我从未制作过 so 文件,实际上我正在尝试加载可执行文件(Ubuntu 没有明确的文件扩展名)。

无论如何,如何使用代码块将我的 cpp 文件编译成 .so 文件。我一直在寻找所有我发现的只是我不太了解的复杂 gcc 命令。

任何有关如何从代码块创建共享对象库的见解都会有很大帮助。

【问题讨论】:

    标签: java c++ java-native-interface codeblocks shared-libraries


    【解决方案1】:

    您可以创建类的对象 (.o) 文件,然后使用 -shared 标记将它们组合成一个动态链接库。
    根据我的经验,代码块并没有为用户提供这样做的能力。您将不得不使用 gcc。

    【讨论】:

    • 我刚刚尝试了 gcc 共享命令:gcc -shared -o hello.so hello.o 它给出了一个错误,但我刚刚发现 CodeBlocks 允许您创建共享库。我会继续尝试这些 gcc 命令。感谢您的回复!
    • 对此我不是特别确定,但试试 gcc -shared -o libhello.so hello.o 让我知道它返回了什么。
    • 那返回:/usr/bin/ld: hello.o: relocation R_X86_64_32 反对`.rodata' 不能在制作共享对象时使用;使用 -fPIC hello.o 重新编译:添加符号时出错:错误值 collect2:错误:ld 返回 1 退出状态
    • 刚刚尝试创建一个与我当前项目无关的随机共享库,一切正常,但是当我尝试包含 时会出现该错误。
    • 好吧,我终于让它在 Windows (DLL) 上工作,遗憾的是我需要以某种方式制作 64 位 dll 来配合我的 64 位 JRE。感谢您的回复。
    【解决方案2】:

    我在 Linux fedorra 下用 shell 脚本 compile_shared.sh 解决了它

    #!/bin/bash
    g++ -I ./include/ -c -fPIC src/MyClass.cpp -o so/MyClass.o
    g++ -shared -Wl,-soname,lib_MyClass.so -o so/lib_MyClass.so  so/MyClass.o
    

    在根文件夹中并调整 Codeblocks 中的构建选项,以便在构建后执行脚本。

    代码块

    • 项目 -> 构建选项 ...
    • 在左侧树视图中选择 cpp
    • 构建前/构建后步骤
    • 在构建后步骤文本字段中添加“xterm -T bash ./compile_shared.sh”

    这会将文件./src/MyClass.cpp 编译为./so/MyClass.o,并在下一步编译为./so/lib_MyClass.so

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 2012-07-02
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多