How to compile Box2D in Linux?

≯℡__Kan透↙ 提交于 2019-12-18 09:04:41

问题


Compiling the Box2d Tesbed is supposed to be simple:

from iforce2d:

Download the Box2D source code archive from here. If you want to use the terminal all the way, you could also do this (if wget is not available, use yum to install it):

wget http://box2d.googlecode.com/files/Box2D_v2.1.2.zip

Use the following commands to unzip and build it. [...]

unzip Box2D_v2.1.2.zip cd Box2D_v2.1.2/Box2D/Build cmake .. make

( These instructions are pretty old, I did get my source with git clone https://github.com/erincatto/Box2D.git )

Running cmake .. from Box2D/Build in the freshly cloned directory causes multiple errors :

CMake Error at Testbed/CMakeLists.txt:84 (add_executable):
  Cannot find source file:

    Framework/imgui.h

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx


CMake Error: Cannot determine link language for target "glfw".
CMake Error: CMake can not determine linker language for target: glfw

Of course, make fails:

[ 42%] Building CXX object Box2D/CMakeFiles/Box2D.dir/Dynamics/b2Body.cpp.o
/home/cabri/Documents/Box2D/Box2D/Box2D/Dynamics/b2Body.cpp: In member function ‘void b2Body::DestroyFixture(b2Fixture*)’:
/home/cabri/Documents/Box2D/Box2D/Box2D/Dynamics/b2Body.cpp:216:17: error: ‘nullptr’ was not declared in this scope
  if (fixture == nullptr)
                 ^
Box2D/CMakeFiles/Box2D.dir/build.make:566: recipe for target 'Box2D/CMakeFiles/Box2D.dir/Dynamics/b2Body.cpp.o' failed
make[2]: *** [Box2D/CMakeFiles/Box2D.dir/Dynamics/b2Body.cpp.o] Error 1
CMakeFiles/Makefile2:85: recipe for target 'Box2D/CMakeFiles/Box2D.dir/all' failed
make[1]: *** [Box2D/CMakeFiles/Box2D.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

Multiple similar questions can be found on these sites, but none has an answer. I know I can install box2d with sudo apt-get install libox2d but I'd like to have the testbed as well.

How can this be done ?


回答1:


If you have the most recent commit from the Box2D repo checked out, you can restore the original CMake files by running this git command in the repository directory:

git checkout 05ee3c3c22af9ac1e5d88061d0b473f814c8210f^ \
 Box2D/Box2D/Box2DConfig.cmake.in \
 Box2D/Box2D/CMakeLists.txt \
 Box2D/Box2D/UseBox2D.cmake \
 Box2D/CMakeLists.txt \
 Box2D/HelloWorld/CMakeLists.txt \
 Box2D/Testbed/CMakeLists.txt \
 Box2D/glew/CMakeLists.txt \
 Box2D/glfw/CMakeLists.txt

Since Box2D has started using C++11 features since this commit, so you will need to add this line to Box2D/CMakeLists.txt:

set (CMAKE_CXX_STANDARD 11)

If you only want the core library built, you're done; just run the following commands:

mkdir build
cd build
cmake -D BOX2D_BUILD_EXAMPLES=OFF ../Box2D

Testbed

If you want the Testbed, things get a bit more involved. The CMakeLists for Box2D's copy of GLFW seems to be completely broken. Open Box2D/CMakeLists.txt, and find these two lines:

add_subdirectory(glew)
add_subdirectory(glfw)

Replace them with the following. This will cause the build to use your system versions of the libraries, so you will need to have them installed:

find_package(GLEW REQUIRED)
if (GLEW_FOUND)
  include_directories(${GLEW_INCLUDE_DIRS})
  link_libraries(${GLEW_LIBRARIES})
endif()

find_package(PkgConfig REQUIRED)
pkg_search_module(GLFW REQUIRED glfw3)
include_directories(${GLFW_INCLUDE_DIRS})

Open Box2D/Testbed/CMakeLists.txt. At the top of the file, under set(Testbed_Framework_SRCS, remove the 4 lines referring to imgui and RenderGL3. Add the following lines in that section:

../imgui/imgui.h
../imgui/imgui.cpp
../imgui/imgui_draw.cpp
../imgui/imgui_impl_glfw_gl3.cpp

Scroll to the bottom and replace the glew and glfw lines with:

${GLEW_LIBRARIES}
${GLFW_STATIC_LIBRARIES}

Finally replace

file(COPY ../Build/Data DESTINATION ..)

with

file(COPY ./Data DESTINATION .)

At this point, the full library and testbed should be buildable:

mkdir build
cd build
cmake ../Box2D



回答2:


Short answer...

yes this can be built, rollback your git clone of Box2D until the build doesn't fail.

Long answer...

Seems you've encountered two separate problems:

  1. Not finding the imgui.h file.
  2. The introduction of nullptr to the Git source tree which requires C++11 or newer language acceptance from the compiler.

Regarding problem 1, there's been an issue filed about that back at the beginning of February 2017: issue 433. Regarding problem 2, there's also been an issue filed for this back in June 2016: issue 414.

While I did not see a resolution on GitHub for problem 1, problem 2 apparently is resolvable by applying pull request #412. You should also be able to resolve problem 2 by having your compiler accept C++11 (or newer).

As for resolving problem 1, you can roll back your git clone of Box2D until the Testbed can be built. If you rollback far enough, that should also resolve problem 2 (without needing to do anything else). Information on how to do the reversion can be found at the SO question of How to revert Git repository to a previous commit?.




回答3:


Ubuntu 17.10 Testbed

The major annoyance is that you currently need premake5, which is yet in alpha and therefore not in Ubuntu:

cd
git clone https://github.com/premake/premake-core
cd premake-core
git checkout v5.0.0-alpha12
make -f Bootstrap.mak linux

cd
git clone https://github.com/erincatto/Box2D
cd Box2D
git checkout f655c603ba9d83f07fc566d38d2654ba35739102
cd Box2D
~/premake-core/bin/release/premake5 gmake
cd Build/gmake
make
# Must be run from there because of a ttf font is at that reative path. GDB told me that. :-)
cd ../../Testbed
../Build/gmake/bin/Debug/Testbed

This builts the .a static library under Build/gmake/bin/Debug.

https://github.com/erincatto/Box2D/issues/387#issuecomment-219168623 gives some insight on the chaotic history of the build system.

First CMake was used, but Erin though premake was better, then premake lost support and the project stuck to Visual Studio + Xcode config files, then the premake project came back from the dead and was reinstated. When will they switch to CMake, which is infinitely portable, and will be forever supported? :-)

Shared library

The steps are the exact same, but first clean up the old static binaries:

git clean -xdf :/

and then before running premake5, apply the following patch to Box2D:

diff --git a/Box2D/premake5.lua b/Box2D/premake5.lua
index b937866..f666651 100644
--- a/Box2D/premake5.lua
+++ b/Box2D/premake5.lua
@@ -23,7 +23,7 @@ workspace "Box2D"
        buildoptions { "-std=c++11" }

 project "Box2D"
-   kind "StaticLib"
+   kind "SharedLib"
    language "C++"
    files { "Box2D/**.h", "Box2D/**.cpp" }
    includedirs { "." }

The testbed still runs as before, but if you move the shared library it stops working as expected.

TODO clean system-wide installation. Manually copying the .so and headers into appropriate paths should work... but not much fun.

CMake revived

So simple, so much better.

Box2D/Box2D/CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
set (CMAKE_CXX_STANDARD 11)
file(GLOB_RECURSE SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "Box2D/*.cpp")
include_directories(${CMAKE_SOURCE_DIR})
add_library(Box2D SHARED ${SOURCES})

target_include_directories(Box2D PUBLIC ${CMAKE_SOURCE_DIR})
set(HELLO_SOURCES HelloWorld/HelloWorld.cpp)
add_executable(hello ${HELLO_SOURCES})
target_link_libraries(hello PRIVATE Box2D)

Then:

cd Box2D/Box2D
mkdir build
cd build
cmake ..
make
./hello

For now, I'll be tracking Box2D as a submodule and using this method for my projects I think, here is an example: https://github.com/cirosantilli/sdl-box2d

find compile static library

This might also be useful if you don't care about OS, and don't want to install premake:

cd Box2D/Box2D/Box2D
find . -iname '*.cpp' | xargs g++ -c -I../
ar rcs libBox2D.a *.o
g++ -I.. ../HelloWorld/HelloWorld.cpp libBox2D.a
./a.out


来源:https://stackoverflow.com/questions/42351640/how-to-compile-box2d-in-linux

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!