Linux 在我的 C++ 项目中使用 Bullet

Use Bullet in my c++ project in Linux

我只想将 Bullet 库用于两个凸包之间的碰撞检测。我的问题是如何 link 我项目中的库并在 CMakeLists.txt.

中指定

我不太明白如何安装子弹库。我将 repo 克隆到一个文件夹中,创建了一个构建文件夹,用 cmake 编译并安装了它。我试图通过添加 CMakeLists.txt:

将库 link 添加到我的项目中
find_package( Bullet REQUIRED )
include_directories(${BULLET_INCLUDE_DIR} )

LINK_LIBRARIES(
 BulletDynamics BulletCollision
)

当我在我的项目中添加 headers 时,这也能正常工作。但是当我使用 Bullet 库的一些函数时,我得到以下编译错误:

/usr/bin/ld: /usr/local/lib/libBulletDynamics.a(btTypedConstraint.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC

我试图 google 它以解决问题,但我无法解决它(我对 CMake 和这些东西的了解非常基础)。 另外我在某处发现该库应该包含在项目中然后编译,所以我的项目结构是这样的:

/trunk 
    CMakeLists.txt
    Findmy_project.cmake
    /bin
    /build
    /src
       /examples
          CMakeLists.txt
          test.cpp
       my_algorithm.cpp
       my_algorithm.h
       CMakeLists.txt

其中 test.cpp 是一个使用 my_algorithm.h 中定义的 class 的源文件,但我现在不知道如何将 Bullet 库 link 添加到项目中.

所以我的问题是总结:我必须如何 link 以及在哪里安装 Bullet 库才能在我的 c++ 项目中使用它?

您需要使用 -fPIC 编译 Bullet 库,如链接器的错误消息所述。

要么用 CMake 变量配置这个库 BUILD_SHARED_LIBS set:

cmake -DBUILD_SHARED_LIBS=on <source-dir>

或使用 CMake 变量 CMAKE_POSITION_INDEPENDENT_CODE 设置:

cmake -DCMAKE_POSITION_INDEPENDENT_CODE=on <source-dir>

第一种方式你将获得共享库,它始终启用 -fPIC 标志,第二种方式你将静态编译库,但明确设置给定标志。