gpt4 book ai didi

c - 什么时候需要 -framework 和 -I/System/.../Example.framework/Headers/?

转载 作者:行者123 更新时间:2023-11-30 14:31:26 24 4
gpt4 key购买 nike

我正在尝试编译一个 JNI 库,它从命令行使用 Carbon。

如果我不 -I/System/.../JavaVM.Framework/Headers/,它找不到任何 jni 类型,并给出错误。

如果我只是 -I/System/.../FlatCarbon.framework/Headers 但不使用“-framework Carbon”,它可以正常编译,但链接器会给出有关 undefined symbol 的错误。

如果我使用 -framework Carbon 进行编译,它工作正常,但事实证明 -I.../FlatCarbon.framework/Headers/是完全不必要的!无论有没有它,它的工作原理都是一样的。现在,到目前为止的一切都有意义,除了以下内容:

如果我框架JavaVM,但包含头目录,那么找不到jni类型!

这看起来完全不一致。对于一个框架,-I 是必需的,-framework 是可选的,对于另一种框架,-framework 是必需的,并且 -I 是可选的。怎么会这样呢?有人可以解释 -framework 选项如何工作吗? JavaVM 是一个特例吗?

我发布这个问题的部分原因是出于好奇,但也是为了帮助其他正在寻找类似解决方案的人,因为至少使用我的google-fu,我无法从命令行找到任何解释框架的内容,或者如何在命令行上使用 gcc 链接到系统库。 gcc --help 甚至没有文档-framework,我能找到的所有内容都是关于使用 xcode 进行开发的。

最佳答案

“-framework”足以满足编译阶段和链接阶段的需要。我猜测您的 JNI 代码没有正确引用 jni.h header (可能缺少对封闭 JavaVM 框架的引用)。

代码如下:

#include <JavaVM/jni.h>

JNIEXPORT jstring JNICALL Java_SomeClass_getStr(JNIEnv *env, jobject obj)
{
jstring javaName = (*env)->NewString(env, (jchar *)"ana", (jsize)3);
return javaName;
}

编译时使用:

gcc -dynamiclib My.c -o My.o -framework JavaVM

关于c - 什么时候需要 -framework 和 -I/System/.../Example.framework/Headers/?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1191950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com