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

发布于 2024-07-29 02:35:28 字数 747 浏览 6 评论 0原文

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

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

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

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

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

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

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

I am trying to compile a JNI library which uses carbon from the command line.

If I don't -I/System/.../JavaVM.Framework/Headers/, It can't find any of the jni types, and gives errors.

If I just -I/System/.../FlatCarbon.framework/Headers but don't "-framework Carbon", it compiles fine, but the linker gives an error about an undefined symbol.

If I compile with -framework Carbon, it works fine, but it turns out that the -I.../FlatCarbon.framework/Headers/ was entirely unnecessary! It works the same with or without it. Now, everything up till now makes sense, except for what follows:

If I -framework JavaVM, but don't include the header directory, then can't find the jni types!

It seems utterly inconsistent. For one framework, the -I is required, and the -framework is optional, for the other, the -framework is required, and the -I is optional. How is this so? Could someone explain how the -framework option works? Is JavaVM a special case?

I am partially posting this question out of curiosity, but also to help anyone else who was searching for a similar solution, because at least with my google-fu, I wasn't able to find anything explaining frameworks from the command line, or how to link to system libraries with gcc on the command line. gcc --help doesn't even document -framework, and everything I could find was about developing with xcode.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

私藏温柔 2024-08-05 02:35:28

“-framework”足以用于编译阶段和链接阶段。
我猜测您的 JNI 代码没有正确引用 jni.h 标头(可能缺少对封闭 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

"-framework" is sufficient for both the compile stage and the linking stage.
I am guessing your JNI code is not correctly referencing the jni.h header (probably missing the reference to the enclosing JavaVM framework).

Code like:

#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;
}

Gets compiled with:

gcc -dynamiclib My.c -o My.o -framework JavaVM
痞味浪人 2024-08-05 02:35:28

框架被考虑用于编译和链接。 我对java一无所知,但也许你的问题与捆绑包与框架有关:例如,多个框架可以包含在一个捆绑包中。 框架也可能包含其他框架

不幸的是,那些特定于 mac 的东西通常没有记录在手册页中。

framework are considered for both compilation and linking. I don't know anything about java, but maybe your problem is related to bundles vs. framework: multiple frameworks can be included in a bundle, for example. A framework may contain other frameworks as well.

Unfortunately, those kind of mac-specific stuff is usually not documented in man pages.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文