由于测试的工程比较大,而对于依赖的open3d又是经过了自己修改的,因此,就想把open3d修改后的代码直接放入到本大工程的thirdparty中来尝试。
用到了ExternalProject_Add这个强大的代码,官网:
https://cmake.org/cmake/help/latest/module/ExternalProject.html
使用时,要注意:
1、每个选项后面不要用双引号包住内容,如:
set(libopen3d_install ${CMAKE_CURRENT_SOURCE_DIR}/libopen3d/install)
set(open3d_src_dir ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/Open3D)
set(open3d_build_dir ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/Open3D/build)
set(open3d_config_cmd cd ${open3d_src_dir}/build && cmake -DGLIBCXX_USE_CXX11_ABI=ON -DCMAKE_INSTALL_PREFIX=${libopen3d_install} .. )
set(open3d_build_cmd cd ${open3d_src_dir}/build && make)
ExternalProject_Add(
Open3D
PREFIX Open3D
SOURCE_DIR ${open3d_src_dir}
# DOWNLOAD_DIR "${OPEN3D_THIRD_PARTY_DOWNLOAD_DIR}/qhull"
UPDATE_COMMAND ""
CONFIGURE_COMMAND "${open3d_config_cmd}"
BUILD_COMMAND "${open3d_build_cmd}"
INSTALL_COMMAND "make install"
# CMAKE_ARGS "-DGLIBCXX_USE_CXX11_ABI=ON -DCMAKE_INSTALL_PREFIX:PATH=${libopen3d_install}"
)
这样是可以的,但是如果:
set(open3d_config_cmd "cd ${open3d_src_dir}/build && cmake -DGLIBCXX_USE_CXX11_ABI=ON -DCMAKE_INSTALL_PREFIX=${libopen3d_install} .. ")
则会出现/bin/sh: -1 … not found 的问题。
2、CONFIGURE_COMMAND,BUILD_COMMAND,INSTALL_COMMAND 这几个选项按照自己的想法配置就好了,反正就是一步步执行下来。如果一步都没有写,都是空字符串,则什么都不会做。
3、附上open3d.cmake内容
include(ExternalProject)
#-----------open3d-----------------//
set(libopen3d_install ${CMAKE_CURRENT_SOURCE_DIR}/libopen3d/install)
set(open3d_src_dir ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/Open3D)
set(open3d_build_dir ${open3d_src_dir}/build)
set(open3d_config_cmd cd ${open3d_src_dir} && mkdir build && cd build && cmake
-DBUILD_SHARED_LIBS=ON
-DBUILD_EXAMPLES=OFF
-DBUILD_PYTHON_MODULE=OFF
-DGLIBCXX_USE_CXX11_ABI=ON
-DCMAKE_INSTALL_PREFIX=${libopen3d_install} .. )
set(open3d_build_cmd cd ${open3d_build_dir} && make -j4)
set(open3d_install_cmd cd ${open3d_build_dir} && make install)
ExternalProject_Add(
Open3D
PREFIX Open3D
SOURCE_DIR ${open3d_src_dir}
UPDATE_COMMAND ""
CONFIGURE_COMMAND "${open3d_config_cmd}"
BUILD_COMMAND "${open3d_build_cmd}"
INSTALL_COMMAND "${open3d_install_cmd}"
# CMAKE_ARGS "-DGLIBCXX_USE_CXX11_ABI=ON -DCMAKE_INSTALL_PREFIX:PATH=${libopen3d_install}"
)
include_directories(
"${libopen3d_install}/include"
"${libopen3d_install}/include/open3d/3rdparty"
)
link_directories(
"${libopen3d_install}/lib"
)
set(ext_open3d_lib ${libopen3d_install}/lib/libOpen3D.so)
上面为啥要生成so呢,因为生成的静态库,在下面的可执行程序链接这个静态库时,会报omp及其他undefined的错误。
在主的
CMakeLists.txt中:
include(cmake/open3d.cmake)
add_executable(test_mesh test/test_mesh.cpp)
target_link_libraries(test_mesh ${ext_open3d_lib})