关于libfreenect2遇到的-fPIC问题

来源:互联网 发布:林振强 知乎 编辑:程序博客网 时间:2024/05/16 00:31


只需在需要編譯的CMakeLists.txt中加入如下一行即可

PROJECT(libfreenect2)


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC"  )


SET(MY_DIR ${libfreenect2_SOURCE_DIR})

SET(DEPENDS_DIR "${MY_DIR}/depends" CACHE STRING "dependency directory must be set to 'false' if external deps are used")

fPIC的目的是什么?共享对象可能会被不同的进程加载到不同的位置上,如果共享对象中的指令使用了绝对地址、外部模块地址,那么在共享对象被加载时就必须根据相关模块的加载位置对这个地址做调整,也就是修改这些地址,让它在对应进程中能正确访问,而被修改到的段就不能实现多进程共享一份物理内存,它们在每个进程中都必须有一份物理内存的拷贝。fPIC指令就是为了让使用到同一个共享对象的多个进程能尽可能多的共享物理内存,它背后把那些涉及到绝对地址、外部模块地址访问的地方都抽离出来,保证代码段的内容可以多进程相同,实现共享。