【问题标题】:How to use Qhull as an external project in CMake?如何在 CMake 中使用 Qhull 作为外部项目?
【发布时间】:2020-07-20 09:58:56
【问题描述】:

我曾尝试在 CMake 中使用 QHull 和 libqhullcpp 作为外部项目,但没有成功。

到目前为止,我使用的这些命令是 this 的修改版本:

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

【问题讨论】:

  • "我的项目找不到任何 Qhull 代码文件。" - 不理解问题描述。你可以再详细一点吗?例如。显示错误信息。
  • @Tsyvarev 这意味着如果我将#include 添加到我的项目中,它将抛出此错误“错误:'Qhull'未在此范围内声明”
  • 请显示完整的错误消息。目前尚不清楚是在 Qhull 头文件还是在您的源文件中检测到错误。唯一清楚的是,标题libqhullcpp/Qhull.h找到,与您在问题帖子中所说的相反。 (错过的标头会导致不同的错误消息)。所以CMakeLists.txt 可能是正确的,但问题出在您的代码 中,您忘记将其包含在问题帖子中。
  • 关于完整错误信息的重要性参见例如这个关于元的问题:meta.stackoverflow.com/q/359146/3440745
  • 因此它找不到您指定为IMPORTED_LOCATION 的库文件。可能,您错误地指定了这些位置。查找构建qhull项目产生的对应文件,并将其路径与您指定的位置进行比较。

标签: c++ cmake qhull


【解决方案1】:

我已经修改了您的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 &amp;&amp; cmake ../QHull,它将下载并开始为您构建 qhull。

唯一的缺点:ExternalProjects${CMAKE_SOURCE_DIR}\QHull\src 保留为INCLUDE_DIRECTORIES 而不是所需的${CMAKE_BINARY_DIR}\qhull-src\src

由于我无法解决此问题,我的解决方法是在 cmake 配置步骤之后将生成器脚本中的 -I${CMAKE_SOURCE_DIR}\QHull\src 替换为 -I${CMAKE_SOURCE_DIR}\QHull\src(例如,在我的情况下为 build.ninja)。

在那之后,我能够构建自己的示例main.cpp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    相关资源
    最近更新 更多