- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在将基于 OGRE 3D 的 C++ 应用程序从纯 Windows 移植到 Linux。我正在使用 Ubuntu 18.04 LTS 和手动构建的 OGRE 3D 1.12.1,它被编译并安装到 /usr/local/lib 和 /usr/local/lib/OGRE这是默认安装位置。
参见:
$ ls -lah /usr/local/lib/
total 9,2M
drwxr-xr-x 6 root root 4,0K Aug 3 11:38 .
drwxr-xr-x 10 root root 4,0K Feb 10 01:12 ..
lrwxrwxrwx 1 root root 22 Aug 3 11:38 libOgreBites.so -> libOgreBites.so.1.12.1
-rw-r--r-- 1 root root 337K Aug 3 11:33 libOgreBites.so.1.12.1
-rw-r--r-- 1 root root 681K Aug 3 11:21 libOgreGLSupport.a
lrwxrwxrwx 1 root root 21 Aug 3 11:38 libOgreHLMS.so -> libOgreHLMS.so.1.12.1
-rw-r--r-- 1 root root 177K Aug 3 11:36 libOgreHLMS.so.1.12.1
lrwxrwxrwx 1 root root 21 Aug 3 11:38 libOgreMain.so -> libOgreMain.so.1.12.1
-rw-r--r-- 1 root root 5,7M Aug 3 11:20 libOgreMain.so.1.12.1
lrwxrwxrwx 1 root root 33 Aug 3 11:38 libOgreMeshLodGenerator.so -> libOgreMeshLodGenerator.so.1.12.1
-rw-r--r-- 1 root root 362K Aug 3 11:34 libOgreMeshLodGenerator.so.1.12.1
lrwxrwxrwx 1 root root 24 Aug 3 11:38 libOgreOverlay.so -> libOgreOverlay.so.1.12.1
-rw-r--r-- 1 root root 576K Aug 3 11:28 libOgreOverlay.so.1.12.1
lrwxrwxrwx 1 root root 25 Aug 3 11:38 libOgreProperty.so -> libOgreProperty.so.1.12.1
-rw-r--r-- 1 root root 79K Aug 3 11:34 libOgreProperty.so.1.12.1
lrwxrwxrwx 1 root root 31 Aug 3 11:38 libOgreRTShaderSystem.so -> libOgreRTShaderSystem.so.1.12.1
-rw-r--r-- 1 root root 1,3M Aug 3 11:31 libOgreRTShaderSystem.so.1.12.1
drwxr-xr-x 3 root root 4,0K Aug 3 11:38 OGRE
drwxr-xr-x 2 root root 4,0K Aug 3 11:38 pkgconfig
drwxrwsr-x 4 root staff 4,0K Jun 23 15:36 python2.7
drwxrwsr-x 3 root staff 4,0K Feb 10 01:12 python3.6
$ ls -lah /usr/local/lib/OGRE
total 1,2M
drwxr-xr-x 3 root root 4,0K Aug 3 11:38 .
drwxr-xr-x 6 root root 4,0K Aug 3 11:38 ..
drwxr-xr-x 2 root root 4,0K Aug 3 11:38 cmake
lrwxrwxrwx 1 root root 25 Aug 3 11:38 Codec_FreeImage.so -> Codec_FreeImage.so.1.12.1
-rw-r--r-- 1 root root 70K Aug 3 11:26 Codec_FreeImage.so.1.12.1
lrwxrwxrwx 1 root root 20 Aug 3 11:38 Codec_STBI.so -> Codec_STBI.so.1.12.1
-rw-r--r-- 1 root root 200K Aug 3 11:26 Codec_STBI.so.1.12.1
lrwxrwxrwx 1 root root 30 Aug 3 11:38 RenderSystem_GL3Plus.so -> RenderSystem_GL3Plus.so.1.12.1
-rw-r--r-- 1 root root 886K Aug 3 11:26 RenderSystem_GL3Plus.so.1.12.1
我的 CMake 构建正在查找所有必需的库(还有/usr/local/lib/OGRE 中的库),但是在我编译二进制文件后,我的 Ubuntu 无法找到位于/usr/local 下的共享库/lib/食人魔:
$ ldd client
linux-vdso.so.1 (0x00007ffd2fde2000)
libhoibase.so => /home/thomas/game/build/hoibase/libhoibase.so (0x00007fbcb3b0c000)
libOgreMain.so.1.12.1 => /usr/local/lib/libOgreMain.so.1.12.1 (0x00007fbcb343e000)
libOgreBites.so.1.12.1 => /usr/local/lib/libOgreBites.so.1.12.1 (0x00007fbcb31fc000)
libOgreOverlay.so.1.12.1 => /usr/local/lib/libOgreOverlay.so.1.12.1 (0x00007fbcb2f8a000)
libOgreRTShaderSystem.so.1.12.1 => /usr/local/lib/libOgreRTShaderSystem.so.1.12.1 (0x00007fbcb2c77000)
RenderSystem_GL3Plus.so.1.12.1 => not found
libSDL2-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0 (0x00007fbcb2945000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fbcb25bc000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbcb221e000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fbcb2006000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbcb1c15000)
libCGAL.so.13 => /usr/lib/x86_64-linux-gnu/libCGAL.so.13 (0x00007fbcb19f6000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007fbcb17ef000)
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fbcb156e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbcb136a000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbcb114b000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fbcb0e13000)
libXt.so.6 => /usr/lib/x86_64-linux-gnu/libXt.so.6 (0x00007fbcb0baa000)
libXaw.so.7 => /usr/lib/x86_64-linux-gnu/libXaw.so.7 (0x00007fbcb0936000)
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007fbcb0682000)
libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 (0x00007fbcb037b000)
libpulse.so.0 => /usr/lib/x86_64-linux-gnu/libpulse.so.0 (0x00007fbcb012b000)
libsndio.so.6.1 => /usr/lib/x86_64-linux-gnu/libsndio.so.6.1 (0x00007fbcaff1b000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fbcafd09000)
libXcursor.so.1 => /usr/lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007fbcafaff000)
libXinerama.so.1 => /usr/lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007fbcaf8fc000)
libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007fbcaf6ec000)
libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007fbcaf4e1000)
libXss.so.1 => /usr/lib/x86_64-linux-gnu/libXss.so.1 (0x00007fbcaf2dd000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007fbcaf0d7000)
libwayland-egl.so.1 => /usr/lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007fbcaeed5000)
libwayland-client.so.0 => /usr/lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007fbcaecc6000)
libwayland-cursor.so.0 => /usr/lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007fbcaeabe000)
libxkbcommon.so.0 => /usr/lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007fbcae87f000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fbcae677000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbcb4350000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fbcae44f000)
libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007fbcae247000)
libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007fbcae02c000)
libXmu.so.6 => /usr/lib/x86_64-linux-gnu/libXmu.so.6 (0x00007fbcade13000)
libXpm.so.4 => /usr/lib/x86_64-linux-gnu/libXpm.so.4 (0x00007fbcadc01000)
libpng16.so.16 => /usr/lib/x86_64-linux-gnu/libpng16.so.16 (0x00007fbcad9cf000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fbcad7b2000)
libpulsecommon-11.1.so => /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-11.1.so (0x00007fbcad534000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007fbcad2e7000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fbcad0d2000)
libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007fbcacec8000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007fbcaccc2000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fbcacaba000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fbcac8b6000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fbcac6b0000)
libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007fbcac42c000)
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007fbcac222000)
libsndfile.so.1 => /usr/lib/x86_64-linux-gnu/libsndfile.so.1 (0x00007fbcabfa9000)
libasyncns.so.0 => /usr/lib/x86_64-linux-gnu/libasyncns.so.0 (0x00007fbcabda3000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fbcabb7d000)
liblz4.so.1 => /usr/lib/x86_64-linux-gnu/liblz4.so.1 (0x00007fbcab961000)
libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007fbcab646000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007fbcab42c000)
libFLAC.so.8 => /usr/lib/x86_64-linux-gnu/libFLAC.so.8 (0x00007fbcab1b5000)
libogg.so.0 => /usr/lib/x86_64-linux-gnu/libogg.so.0 (0x00007fbcaafac000)
libvorbis.so.0 => /usr/lib/x86_64-linux-gnu/libvorbis.so.0 (0x00007fbcaad81000)
libvorbisenc.so.2 => /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x00007fbcaaad8000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007fbcaa8bd000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007fbcaa6a8000)
我做错了什么?让 Ubuntu 找到我的 RenderSystem_GL3Plus.so.1.12.1 的技巧是什么?
最佳答案
I am currently porting my OGRE 3D-based C++ application from pure Windows to Linux. I am using Ubuntu 18.04 LTS and a manually build OGRE 3D 1.12.1 which was compiled and installed to /usr/local/lib and /usr/local/lib/OGRE which is the default install location...
正如其他人所说,运行时链接程序无法找到各种 OGRE 库。在构建文件夹中执行时,您通常使用 LD_LIBRARY_PATH
来提供将库放在路径上所需的覆盖。
一旦您执行了 make install
,二进制文件应该能够找到该库,因为 (1) 库位于众所周知的路径中;或 (2) 二进制文件有一个包含库位置的 RUNPATH
。有时您在安装后使用 (3) 使用 LD_LIBRARY_PATH
。做 (3) 有点糟糕,你应该避免它。
听起来程序client
缺少包含OGRE 库位置的RUNPATH
。 client
应该有一个 DT_RUNPATH
和 /usr/local/lib/OGRE
(不是 DT_RPATH
)。另见 Is there a way to inspect the current rpath on Linux? .
您需要 DT_RUNPATH
,因为 DT_RUNPATH
允许 LD_LIBRARY_PATH
覆盖。 DT_RPATH
不允许覆盖LD_LIBRARY_PATH
。
如果 RUNPATH
不存在,则使用 LDFLAGS += -Wl,-R,/usr/local/lib/OGRE -Wl,--enable-new- 添加它dtags
。在 CMake 中,您可以使用 CMAKE_MODULE_LINKER_FLAGS
、CMAKE_SHARED_LINKER_FLAGS
和 CMAKE_STATIC_LINKER_FLAGS
添加链接器标志。 -Wl,-R,/usr/local/lib/OGRE -Wl,--enable-new-dtags
应该添加到您正在使用的每个标签中。另见 How to set the LDFLAGS in CMakeLists.txt? .
注意:您可能需要为 client
和 OGRE 库添加选项到 LDFLAGS
,因为 OGRE 库可能相互依赖。
对您来说更灵活的方法可能是使用 -Wl,-R,'$$ORIGIN/../lib/OGRE' -Wl,--enable-new-dtags
。 $ORIGIN
是您的程序所在的位置,它告诉运行时链接器在相对目录 ../lib/OGRE
中查找其库。它允许您移动程序(在 .../bin/
中)和库(在 .../lib/
和 .../lib/OGRE
) 在文件系统上。
您可以感谢 glibc 人员解决了过去 25 年左右困扰 Linux 的 Linux 路径问题。他们认为针对某个版本的库进行编译,针对某个版本的库进行链接,然后在运行时加载错误版本的库或在运行时丢失库是正常的。他们应该得到 Darwin Award因为没有修正这个愚蠢的决定。
(做出错误的决定是可以的,因为我们都会犯错误。但是,他们从来没有解决过。相反,他们让这些问题恶化了几十年。)
关于c++ - 在 Linux 上执行二进制文件时找不到与 CMake 链接的 OGRE 3D 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57337433/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!