小编Zor*_*Hut的帖子

在构建依赖于它的程序后,如何更改共享库的文件名?

我有一个程序依赖于它希望在目录结构内部找到的共享库.我想将该共享库移到更好的位置.在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并不是我想要的,我不需要在全球范围内改变搜索路径.

linux linker shared-libraries install-name-tool

20
推荐指数
3
解决办法
2万
查看次数

如何从iPhone应用程序中删除UIApplicationMain?

我正试图将游戏库移植到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唯一的另一件事.)

我有三个我能想到的真实想法,但它们都是一项重大的实施工作,所以我想知道是否有人有这方面的经验,然后我会花一天时间尝试注定的想法.

  • 在Init中,生成一个新线程,在该线程中运行UIApplicationMain.要么跨线程(ugh)传递所有事件,要么只是将UIApplicationMain线程置于休眠状态并在主线程中使用CFRunLoop.我听说UIApplicationMain不喜欢在不同的线程中运行.
  • 完全忽略UIApplicationMain,只需使用NSRunLoop.我是否会错过重要的iPhone设置?谁知道!
  • 做一些可怕的事情,使用longjmp()在安装后跳出UIApplicationMain代码,祈祷它在拆解过程中没有做任何重要的事情.

建议?

iphone uiapplication nsrunloop

11
推荐指数
2
解决办法
2865
查看次数

如何将光标锁定在Mac OS X上的窗口内?

我正在尝试为Mac OS X制作一款游戏,它涉及很多快速动作并且在鼠标光标周围投掷.如果用户想要以窗口模式播放,我非常希望将光标锁定在窗口内部以避免在激烈的战斗中意外更改程序(显然,如果用户更改程序或命中时,这将自行取消暂停菜单.)

在Windows上,这可以通过ClipCursor()轻松完成.我在Mac OS X上找不到同等产品.有吗?

macos cursor cursor-position

10
推荐指数
1
解决办法
3843
查看次数

构建不需要最新glibc的软件的最佳方法是什么?

我正在尝试构建一个可以在多个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上工作吗?

或者,是否只有一些方便的编译器标志或软件包我可以安装来解决问题?

linux glibc backwards-compatibility

8
推荐指数
1
解决办法
518
查看次数

C++:实现在匿名结构中定义的函数

给出以下代码:

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()',它发生在我身上可能有些疯狂的可能句法.

c++

4
推荐指数
1
解决办法
587
查看次数