c++ - 如何在 CMake 中使用 Qhull 作为外部项目?
问题描述
我曾尝试在 CMake 中使用 QHull 和 libqhullcpp 作为外部项目,但没有成功。
到目前为止,我已经使用了这些命令,它们是这个的修改版本:
include(ExternalProject)
ExternalProject_add(qhull
GIT_REPOSITORY "https://github.com/qhull/qhull.git"
GIT_TAG "2019.1"
GIT_PROGRESS TRUE
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/qhull
BINARY_DIR ${CMAKE_BINARY_DIR}/thirdparty-build/qhull
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/thirdparty-install"
CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
)
### qhullstatic reentrant library
add_library(libqhullstatic_r STATIC IMPORTED)
set_property(TARGET libqhullstatic_r PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/thirdparty-build/qhull/${CMAKE_STATIC_LIBRARY_PREFIX}qhullstatic_r${CMAKE_STATIC_LIBRARY_SUFFIX})
set_property(TARGET libqhullstatic_r PROPERTY IMPORTED_LOCATION_DEBUG ${CMAKE_BINARY_DIR}/thirdparty-build/qhull/Debug/${CMAKE_STATIC_LIBRARY_PREFIX}qhullstatic_r${CMAKE_STATIC_LIBRARY_SUFFIX})
set_property(TARGET libqhullstatic_r PROPERTY IMPORTED_LOCATION_RELEASE ${CMAKE_BINARY_DIR}/thirdparty-build/qhull/Release/${CMAKE_STATIC_LIBRARY_PREFIX}qhullstatic_r${CMAKE_STATIC_LIBRARY_SUFFIX})
add_dependencies(libqhullstatic_r qhull)
### qhullcpp library
add_library(libqhullcpp STATIC IMPORTED)
set_property(TARGET libqhullcpp PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/thirdparty-build/qhull/${CMAKE_STATIC_LIBRARY_PREFIX}qhullcpp${CMAKE_STATIC_LIBRARY_SUFFIX})
set_property(TARGET libqhullcpp PROPERTY IMPORTED_LOCATION_DEBUG ${CMAKE_BINARY_DIR}/thirdparty-build/qhull/Debug/${CMAKE_STATIC_LIBRARY_PREFIX}qhullcpp${CMAKE_STATIC_LIBRARY_SUFFIX})
set_property(TARGET libqhullcpp PROPERTY IMPORTED_LOCATION_RELEASE ${CMAKE_BINARY_DIR}/thirdparty-build/qhull/Release/${CMAKE_STATIC_LIBRARY_PREFIX}qhullcpp${CMAKE_STATIC_LIBRARY_SUFFIX})
set_property(TARGET libqhullcpp PROPERTY INTERFACE_LINK_LIBRARIES libqhullstatic_r)
add_dependencies(libqhullcpp qhull)
add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} ${libqhullcpp})
我的项目找不到任何 Qhull 代码文件,如果我添加
#include <libqhullcpp/Qhull.h>
orgQhull::Qhull qhull;
到我的项目它会抛出这个编译错误:
CMakeFiles/MyProject.dir/src/main.cpp.o: In function `main':
~/MyProject/src/main.cpp:108: undefined reference to `orgQhull::Qhull::Qhull()'
~/MyProject/src/main.cpp:108: undefined reference to `orgQhull::Qhull::~Qhull()'
~/MyProject/src/main.cpp:108: undefined reference to `orgQhull::Qhull::~Qhull()'
collect2: error: ld returned 1 exit status
CMakeFiles/MyProject.dir/build.make:83: recipe for target 'MyProject' failed
make[3]: *** [MyProject] Error 1
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/MyProject.dir/all' failed
make[2]: *** [CMakeFiles/MyProject.dir/all] Error 2
CMakeFiles/Makefile2:111: recipe for target 'CMakeFiles/MyProject.dir/rule' failed
make[1]: *** [CMakeFiles/MyProject.dir/rule] Error 2
Makefile:131: recipe for target 'MyProject' failed
make: *** [MyProject] Error 2
解决方案
我已经修改了你的CMakeLists.txt
文件并做了一些优化,所以你不要在源代码中构建。我tree
给出了这个:
--QHull
| |--CMakeLists.txt
| |--CMakeLists.txt.in
| |--src
| |--main.cpp
|--build
与CMakeLists.txt
:
cmake_minimum_required(VERSION 3.0)
project(TestQHull)
configure_file(CMakeLists.txt.in qhull-download/CMakeLists.txt)
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/qhull-download"
)
execute_process(COMMAND "${CMAKE_COMMAND}" --build .
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/qhull-download"
)
add_subdirectory("${CMAKE_BINARY_DIR}/qhull-src"
"${CMAKE_BINARY_DIR}/qhull-build"
)
include_directories(${CMAKE_BINARY_DIR}/qhull-src/src)
link_directories(${CMAKE_BINARY_DIR}/qhull-build)
### qhullstatic reentrant library
add_library(libqhullstatic_r STATIC IMPORTED)
set_property(TARGET libqhullstatic_r PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/qhull-build/${CMAKE_STATIC_LIBRARY_PREFIX}qhullstatic_r${CMAKE_STATIC_LIBRARY_SUFFIX})
add_dependencies(libqhullstatic_r qhull)
### qhullcpp library
add_library(libqhullcpp STATIC IMPORTED)
set_property(TARGET libqhullcpp PROPERTY IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/qhull-build/${CMAKE_STATIC_LIBRARY_PREFIX}qhullcpp${CMAKE_STATIC_LIBRARY_SUFFIX})
set_property(TARGET libqhullcpp PROPERTY INTERFACE_LINK_LIBRARIES libqhullstatic_r)
add_dependencies(libqhullcpp qhull)
add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} libqhullstatic_r libqhullcpp)
和
CMakeLists.txt.in
内容如下:
cmake_minimum_required(VERSION 3.0)
project(qhull-download NONE)
include(ExternalProject)
ExternalProject_add(qhull
GIT_REPOSITORY https://github.com/qhull/qhull.git
GIT_TAG 2019.1
GIT_PROGRESS TRUE
SOURCE_DIR ${CMAKE_BINARY_DIR}/qhull-src
BINARY_DIR ${CMAKE_BINARY_DIR}/qhull-build
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
CMAKE_CACHE_ARGS ""
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
)
如果你cd build && cmake ../QHull
,它将下载并开始为你构建 qhull。
唯一的缺点:ExternalProjects
保留${CMAKE_SOURCE_DIR}\QHull\src
asINCLUDE_DIRECTORIES
而不是 required ${CMAKE_BINARY_DIR}\qhull-src\src
。
由于我无法解决这个问题,我的解决方法是在 cmake 配置步骤之后替换-I${CMAKE_SOURCE_DIR}\QHull\src
生成-I${CMAKE_SOURCE_DIR}\QHull\src
器脚本(例如build.ninja
在我的情况下)。
之后,我能够构建自己的示例main.cpp
。
推荐阅读
- angular - 如何将对象数组导出到angular4中的excel?
- amazon-ec2 - 通过 CloudFormation 模板基于可用 AMI 启动 EC2 实例
- django - InconsistentMigrationHistory - 迁移 .. 在其依赖项之前应用
- postgresql - 如何在 postgres 中实现 shareplex_ignore_trans?
- java - 如何在 android studio 中导入 javax.json.binding?
- php - 如何在使用 PHP 的过程中重新加载页面?
- php - cpanel服务器中的laravel调试栏问题
- maven - 未找到 Maven 项目库
- python - 在 Airflow 内的 docker 内运行 python 脚本
- java - 带有非活动窗口的 MouseListener