java - 编译 JVMTI 代理(使用 GCC,在 OSX Snow Leopard 上)

标签 java c++ macos gcc osx-snow-leopard

我尝试在 Snow Leopard 上使用 g++ 命令构建 JVMTI 代理,但出现以下错误:

$ g++ -o agent.so -I `/usr/libexec/java_home`/include agent.cpp

Undefined symbols: "_main", referenced from: start in crt1.10.6.o ld:
symbol(s) not found collect2: ld returned 1 exit status

在 gcc 和 C++ 编程方面我完全是个新手,所以我不知道那个错误是什么意思。代理本身非常基础:

      #include 
      #include 

      JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
      {
          std::cout <<"Loading aspect..." <<std::endl;
          return JNI_OK;
      }

如果您对消息有任何帮助,我们将不胜感激。

最佳答案

您提供给 g++ 的命令行选项告诉它您正在尝试构建可执行文件,而不是共享库。 g++ 提示您没有定义 main 函数,因为每个可执行文件都需要一个。

使用 -c 标志编译您的共享库,以便 g++ 知道要构建一个库,即编译和汇编您的代码,但不要尝试将其链接到可执行文件中。

g++ -c -o agent.so -I `/usr/libexec/java_home`/include agent.cpp

关于java - 编译 JVMTI 代理(使用 GCC,在 OSX Snow Leopard 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1420602/

相关文章:

java - 摩根和一根绳子 HackerRank

java - 如果 COM 对象实现接口(interface),如何使用 JIntegra 在 Java 中进行检查?

java - 如何知道处理器风扇的速度?

支持获取嵌套对象字段值的java反射库。

c++ - 重载本地 lambda 函数

c++ - 在 C++ 的多个函数中使用输入变量

c++ - 当我们将 char 转换为大于 256 的数字时会发生什么?

c - 使用 arduino 和 C 初始化串行接口(interface)

macos - 我如何知道我的 OS X 应用程序使用哪个 Gatekeeper 签名?

swift - 在 Swift 中向 OSX 项目添加测试时无法访问主要目标方法