我有一个程序依赖于它希望在目录结构内部找到的共享库.我想将该共享库移到更好的位置.在OS X上,可以使用install_name_tool完成此操作.我无法找到Linux的等价物.
作为参考,readelf -d myprogram
吐出以下释义输出:
Dynamic section at offset 0x1e9ed4 contains 30 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [this/is/terrible/library.so]
0x00000001 (NEEDED) Shared library: [libGL.so.1]
0x00000001 (NEEDED) Shared library: [libGLU.so.1]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
(continues in an uninteresting fashion)
Run Code Online (Sandbox Code Playgroud)
(并根据要求,ldd myprogram
:)
linux-gate.so.1 => (0x0056a000)
this/is/terrible/library.so => not found
libGL.so.1 => /usr/lib/mesa/libGL.so.1 (0x0017d000)
libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00a9c000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00710000)
(etc, etc)
Run Code Online (Sandbox Code Playgroud)
我想将"this/is/terrible/library.so"改为"shared/library.so".请注意,如果程序保留在其"构建"位置,其中/// ter//.实际存在的相对路径,则ldd能够找到它,正如您所期望的那样.
我知道RPATH并不是我想要的,我不需要在全球范围内改变搜索路径.
我正试图将游戏库移植到iPhone上.与SDL不同,此库不完全控制main()函数,它通过快速返回的函数与您自己的代码进行通信.所以,例如,明显的伪代码:
int main() {
library_init();
// game init code here
while(we_have_not_quit_the_game) {
library_message_loop();
library_init_render();
// render stuff
library_end_render();
// update game state
}
library_shutdown();
}
Run Code Online (Sandbox Code Playgroud)
iPhone使这很困难,因为它要求你调用一个永不返回的UIApplicationMain函数.在library_init();之后我根本无法回到用户代码.
我不相信它是必要的 - 有NSRunLoop可以用来处理这些事件.然而,我不知道UIApplicationMain是否做了其他重要的事情.(请注意,我没有计划使用.nib文件,这是我发现UIApplicationMain唯一的另一件事.)
我有三个我能想到的真实想法,但它们都是一项重大的实施工作,所以我想知道是否有人有这方面的经验,然后我会花一天时间尝试注定的想法.
建议?
我正在尝试为Mac OS X制作一款游戏,它涉及很多快速动作并且在鼠标光标周围投掷.如果用户想要以窗口模式播放,我非常希望将光标锁定在窗口内部以避免在激烈的战斗中意外更改程序(显然,如果用户更改程序或命中时,这将自行取消暂停菜单.)
在Windows上,这可以通过ClipCursor()轻松完成.我在Mac OS X上找不到同等产品.有吗?
我正在尝试构建一个可以在多个Linux发行版上运行的二进制包.它目前建立在Ubuntu 10.04上,但它在Ubuntu 8.04上失败,出现以下错误:
./test: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./test)
./test: /usr/lib/libstdc.so.6: version `GLIBC_2.11' not found (required by ./test)
Run Code Online (Sandbox Code Playgroud)
解决这个问题的首选方法是什么?有没有办法在新的盒子上安装旧的glibc并针对它构建,或者我是否必须构建旧的发行版?如果我建立一个旧的glibc,它会在一个新的glibc上工作吗?
或者,是否只有一些方便的编译器标志或软件包我可以安装来解决问题?
给出以下代码:
class Named {
class /*Unnamed*/ {
void Function();
} un;
};
// Implement Named::Unnamed::Function here
int main() {
Named named;
named.un.Function();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法实现Named :: Unnamed :: Function而无需命名Unnamed或在Named的定义中嵌入函数的定义?
我猜测答案是"不",但是GCC给了我一个有用的信息"未命名的引用`Named :: {unnamed type#2} :: Function()',它发生在我身上可能有些疯狂的可能句法.