gpt4 book ai didi

xcode - 从 C# 调用纯 C 函数时,首先是 DllNotFoundException,然后是 EntryPointNotFoundException

转载 作者:行者123 更新时间:2023-12-02 02:17:06 24 4
gpt4 key购买 nike

我正在尝试在 Unity3D pro 中使用一些 C 代码。

我的基本方法是 (1) 将 C 源代码构建到静态库中 (2) 创建一个空包并链接库 (3) 将包导入 Unity 3D pro(作为插件)。

我基本上是在关注this tutorial .

它已经为我工作了一段时间,直到最近当我更新我的 C 代码并重新编译和重建库和包时,一切都出错了......

当我第一次导入包时,我遇到了一个DllNotFoundException

在那个阶段,我的捆绑项目只是一堆库——从我的源代码(它是一个 .a 文件)构建的库和我认为 .a 库依赖的一些其他库(其他库有.dylib 扩展名)。

我在包中添加了一个 test.c 文件。测试 .c 文件仅包含两行:

#include <stdio.h>
#include "ccn.h"

char* say()
{
return "hi";
}

其中ccn.h是我的C源代码的头文件。

在我重新构建包后,DllNotFoundExeption 消失了,但我得到了一个EntryPointNotFoundException

这是我的想法:

  1. 因为 Xcode 非常智能,我猜测在添加简单的 test.c 文件时,Xcode 为我修改了一些包设置。我相信这就是 DllNotFoundException 最初消失的原因。 我的想法对吗?
  2. 我认为要解决 EntryPointNotFound 问题,我还必须修改一些捆绑项目设置 - 但我不知道如何...请帮助我...

非常感谢!

编辑

  1. 我看到了 this thread建议由于 Xcode 使用 g++ 进行编译,即使我的非托管代码是纯 C 语言,我也需要 extern "C"。我在 Xcode4 中将目标设置更改为 "Compiler for C/C++/Objective-C"从 Apple LLVM 3.0LLVM GCC 4.2,但我仍然遇到相同的异常。
  2. 我还看到了this mono documentation这表示 mono 正在使用 GLib 加载库,而 Glib 在 Mac OS X 上有一个错误,即它无法识别 .dylib 库。我删除了 .dylib 库并再次尝试,但我还是遇到了同样的异常。
  3. 还有 Apple's documentation表示每个 loadable bundle 都必须有一个主体类,如果用户没有指定哪个类是主体类,NSBundle 将使用 Xcode 项目中显示的第一个类作为主体类。好吧,我想我创建的包是一个可加载的包,但因为它只是一个从 C 构建的静态库,所以它实际上没有任何类。当我查看项目的 info.plist 时,Principal Class 条目是空的。这可能是问题所在吗?如果是,我该如何解决?
  4. 另外我在 Apple 的文档中看到了一些我不太理解的内容:

    If your loadable bundle is a plug-in, the host application developer usually provides an interface for the plug-in architecture in a framework. This framework typically contains a class that all plug-in principal classes inherit from, or a protocol (formal or informal) for the plug-in’s principal class to adopt.

    我很确定我创建的可加载包是一个插件。我正在将 bundle 导入 Unity3D。这是否意味着我应该从 Unity 定义一个主体类?怎么办?

最佳答案

这个问题有一个简单的解决方案:

首先在 test.c 文件中尝试任何给你 EntryPointNotFoundException 的函数。

“尝试”是指在您的 main() 中调用该函数并首先在 C 中对其进行测试。

在我的例子中,抛出 EntryPointNotFoundException 的函数称为 ccn_run()。所以我做了以下事情:

  1. 在 test.c 中添加一个 main() 函数
  2. 在 main() 函数中输入 ccn_run()
  3. 在Xcode项目中添加一个命令行目标并进行测试

我试过了,这个函数在 C 中工作正常,现在神奇的是,当我重建包时(不删除 main() 函数和里面的 ccn_run() 调用),Unity 可以调用 ccn_run () 功能没问题!

我无法解释为什么这能解决我的问题,但这已经为我工作了将近一个月。不久前 Xcode 升级到 4.3.2,我再次尝试同样的方法,仍然有效。我想也许添加一个 main() 函数有助于定义入口点?

最后,我记录了将C代码导入Unity的整个过程,很高兴在这里分享:https://docs.google.com/document/d/1vAeupNQlBTY3y3Bma5Jo_Hs4JRYm6FoEc4vQN0WBGNg/edit

我的代码示例:

  1. Xcode 项目:https://github.com/CherryQu921/CCNxPlugin
  2. Unity 项目:https://github.com/CherryQu921/cqs

希望这个答案,尤其是我的教程对您有所帮助!

关于xcode - 从 C# 调用纯 C 函数时,首先是 DllNotFoundException,然后是 EntryPointNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989307/

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