菜鸟教程小白 发表于 2022-12-11 17:39:55

ios - .c 文件通过桥接头在 Xcode 8 更新后不起作用


                                            <p><p>我一直在开发的应用程序使用了一个外部库 pdlib,它有自己的外部文件(.c 文件),我通过桥接头 <code>#import "Uzi.c"</code>#import "Uzi.c"</code> 并通过 Uzi.c 的设置函数 <code>Uzi_setup()</code> 在我的 <code>ViewController</code> 类中调用我的主 Swift 文件。直到几天前更新到新的公共(public) Xcode 8 之后,我才对此没有任何问题(我在夏季对 Xcode 8 Beta 1 没有任何问题)。 </p>

<p>这是我得到的 7 个错误,列在一个“Mach-O 链接器错误”保护伞下:</p>

<pre><code>Undefined symbols for architecture x86_64:
&#34;_Uzi_bang&#34;, referenced from:
_Uzi_setup in ViewController.o
&#34;_Uzi_class&#34;, referenced from:
_Uzi_setup in ViewController.o
&#34;_Uzi_float&#34;, referenced from:
_Uzi_setup in ViewController.o
&#34;_Uzi_new&#34;, referenced from:
_Uzi_setup in ViewController.o
&#34;_Uzi_pause&#34;, referenced from:
_Uzi_setup in ViewController.o
&#34;_Uzi_resume&#34;, referenced from:
_Uzi_setup in ViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
</code></pre>

<p>那些 undefined symbol 是来自 Uzi.c 的 6 个函数和一个类声明。这是整个 c 文件的链接:<a href="https://github.com/electrickery/pd-miXedSon/blob/master/hammer/Uzi.c" rel="noreferrer noopener nofollow">https://github.com/electrickery/pd-miXedSon/blob/master/hammer/Uzi.c</a> </p>

<p>我已经尝试了我在网上找到的所有解决类似问题的解决方案,但还没有解决方案...我尝试将“架构”和“有效架构”设置更改为仅 armv7 和 armv7s(无 arm64)和将“仅构建事件架构”更改为“否”。这些步骤似乎对处于类似情况的其他人有所帮助,但它们对我不起作用(并且去掉 arm64 会导致出现额外的错误)。</p>

<p>XCode 8 是相当新的版本(公共(public)版本于 9 月 13 日发布),因此几乎没有其他关于此升级的问题会导致类似问题。 </p>

<p>任何帮助将不胜感激!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>由@danomatika 在 GitHub 上解决:<a href="https://github.com/libpd/libpd/issues/149" rel="noreferrer noopener nofollow">https://github.com/libpd/libpd/issues/149</a> </p>

<p>“您通常不应包含/导入实现文件,即 .c、.cpp、.m 等。这是导致重复符号问题的原因。</p>

<p>这就是头文件中的“前向函数声明”的作用:告诉编译器一个函数存在以及它需要/返回什么数据。然后编译器假定函数的实际实现存在于实现文件中。如果找不到,则会收到“ undefined symbol 错误”。如果你最终以某种方式声明了函数两次,也就是在 .c 文件中包含带有前向声明的 header 和函数本身的实现,那么你会得到一个“重复符号错误”。</p>

<p>这都是低级的东西,只是一个真正的问题,因为 Pd 外部是围绕动态库设计的,所以没有构建或提供包含函数声明的头文件。这就是为什么你必须做一些额外的工作并自己做。</p>

<p>他们有两个简单的解决方法,都涉及在头文件中声明要从 .c 文件调用的所需函数。</p>

<ol>
<li><p>只需在桥接头中声明函数即可:</p>

<p><code>void uzi_setup();</code></p></li>
<li><p>创建一个 header ,例如 Externals.h,并在其中声明所有外部内容:</p>

<p><code>//前向声明仅在 .c 实现中发现的设置函数
void uzi_setup();</code></p>

<p><code>//便利包装函数
无效的外部设置(){
    uzi_setup();
}</code></p>

<p>然后在你的桥接头中导入文件:</p>

<p><code>#import "Externals.h"</code></p>

<p>您现在可以在 swift 中执行以下操作:</p>

<p><code>externals_setup()</code></p></li>
</ol></p>
                                   
                                                <p style="font-size: 20px;">关于ios - .c 文件通过桥接头在 Xcode 8 更新后不起作用,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39736040/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39736040/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - .c 文件通过桥接头在 Xcode 8 更新后不起作用