编译 IOS 应用程序时的库问题

Posted

技术标签:

【中文标题】编译 IOS 应用程序时的库问题【英文标题】:Library issues while compiling IOS application 【发布时间】:2014-07-30 04:50:06 【问题描述】:

这是一个有点复杂的问题,所以让我提供一些背景信息,以便您了解这里问题的全部范围。我对此也很陌生,到目前为止这是一次学习经历,所以如果我遗漏了一些明显或简单的东西,或者这个问题过于冗长和详细,我深表歉意。

我正在尝试为 Raspberry PI 编译一个 ios 应用程序。该应用程序是一个名为 Sauerbraten 的 3D 游戏/游戏引擎,由于其低性能要求、开源性质和实时地图编辑,我相信它在 PI 上用于娱乐、修补和教育用途会很棒。

它使用 SDL 和 GL 1.x,而且我已经成功地能够毫无问题地构建和运行原始源代码,除了它使用软件渲染运行的明显事实,因此使用起来太慢了。值得庆幸的是,之前有人将游戏移植到了 iPhone 上,因此也移植到了 GLES,所以我决定使用它而不是为 GLES 重新编码原始版本。

由于我还是新手,所以我决定先尝试编译它,然后看看需要更改或修复什么。这就是问题所在,我立即遇到了几个问题。首先,它似乎无法进入子目录,或者至少无法在其中找到标题。如果我尝试编译它,我会得到:

pi@raspberrypi ~/cube/Saurbraten/trunk/src $ sudo make
make    -C enet/ all
make[1]: Entering directory `/home/pi/cube/Saurbraten/trunk/src/enet'
/bin/bash ./libtool --tag=CC   --mode=compile gcc -DPACKAGE_NAME=\"libenet\" -DPACKAGE_TARNAME=\"libenet\" -DPACKAGE_VERSION=\"1.3.0\" -DPACKAGE_STRING=\"libenet\ 1.3.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"libenet\" -DVERSION=\"1.3.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAS_GETHOSTBYADDR_R=1 -DHAS_GETHOSTBYNAME_R=1 -DHAS_POLL=1 -DHAS_FCNTL=1 -DHAS_INET_PTON=1 -DHAS_INET_NTOP=1 -DHAS_MSGHDR_FLAGS=1 -DHAS_SOCKLEN_T=1 -I. -Iinclude    -g -O2 -MT callbacks.lo -MD -MP -MF .deps/callbacks.Tpo -c -o callbacks.lo callbacks.c
libtool: compile:  gcc -DPACKAGE_NAME=\"libenet\" -DPACKAGE_TARNAME=\"libenet\" -DPACKAGE_VERSION=\"1.3.0\" "-DPACKAGE_STRING=\"libenet 1.3.0\"" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"libenet\" -DVERSION=\"1.3.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAS_GETHOSTBYADDR_R=1 -DHAS_GETHOSTBYNAME_R=1 -DHAS_POLL=1 -DHAS_FCNTL=1 -DHAS_INET_PTON=1 -DHAS_INET_NTOP=1 -DHAS_MSGHDR_FLAGS=1 -DHAS_SOCKLEN_T=1 -I. -Iinclude -g -O2 -MT callbacks.lo -MD -MP -MF .deps/callbacks.Tpo -c callbacks.c  -fPIC -DPIC -o .libs/callbacks.o
callbacks.c:6:18: fatal error: enet.h: No such file or directory
compilation terminated.
make[1]: *** [callbacks.lo] Error 1
make[1]: Leaving directory `/home/pi/cube/Saurbraten/trunk/src/enet'
make: *** [libenet] Error 2
pi@raspberrypi ~/cube/Saurbraten/trunk/src $ 

我通过将头文件从 /src/enet/include/enet 复制到 /src/enet 中“解决了”这个问题。 Enet 然后编译成功,但我认为这可能是由一个更大的问题引起的一个问题,这也是我当前问题的原因。

我目前的问题是在尝试编译其余部分时,我得到了这个:

pi@raspberrypi ~/cube/Saurbraten/trunk/src $ sudo make
make    -C enet/ all
make[1]: Entering directory `/home/pi/cube/Saurbraten/trunk/src/enet'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/home/pi/cube/Saurbraten/trunk/src/enet'
g++ -O3 -fomit-frame-pointer -Wall -fsigned-char -Ishared -Iengine -Ifpsgame -Ienet/include -I/usr/X11R6/include `sdl-config --cflags` -o shared/cube.h.gch.tmp shared/cube.h
shared/cube.h:87:26: fatal error: SDL_opengles.h: No such file or directory
compilation terminated.
make: *** [shared/cube.h.gch] Error 1

我已尝试下载该标头并将其放入 /src/shared 目录,但后来我得到了:

shared/cube.h:88:29: fatal error: OpenGLES/es1/gl.h: No such file or directory
compilation terminated.

即使修改标头使其指向 gl.h 的正确路径也不能解决或更改错误,所以在这一点上,我确定问题一定出在 makefile 上,但我不知道是什么这个问题正在看到,因为作者已经毫无问题地编译了它。我希望这个问题不会太含糊,但在这一点上,我还没有想法。我已经在 Raspberry-PI 论坛上问过,他们建议安装 SDL2,但没有解决任何问题,可能是因为它没有使用 SDL2。

编辑:我忘了提到环境是什么——我在 Raspbian 上,实际上是 debian,使用“Make”命令,没有 XCode 或类似命令。源没有配置文件。

【问题讨论】:

与其更改头文件,不如将路径添加到 make 选项 【参考方案1】:

编译时需要添加-Idirectory/to/include。

一种常见的做法是将其添加到 CFLAGS(或 CXXFLAGS)上,因为您希望将包含文件夹指定给将要编译的所有对象。

对于您的情况(考虑到 src 位于系统的根目录中):

CFLAGS=-I/src/enet/include/enet

【讨论】:

感谢您的帮助,尽管这实际上并没有解决我的任何一个问题。我自己想出了一个愚蠢的解决方案。它在 OpenGLES/es1 上要求 gl.h,所以我刚刚创建了它并将 gl.h 放入其中。我仍然相信,如果它继续这样操作,那就是严重错误,所以这个技巧以后可能会有用,谢谢。

以上是关于编译 IOS 应用程序时的库问题的主要内容,如果未能解决你的问题,请参考以下文章

c++ 编译运行时的库链接问题

反编译 C# 时的“PrivateImplementationDetails”函数

在 iOS 下使用 Stitcher 时的 OpenCV 编译器错误

如何编译使用从不同编译器编译的库的应用程序?

使用与使用不同 gcc 版本编译的库不同的 gcc 编译应用程序

CMake和静态库顺序