首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Cmake中安装并链接到Apache

在Cmake中安装并链接到Apache
EN

Stack Overflow用户
提问于 2022-10-03 12:27:39
回答 2查看 273关注 0票数 0

我正在尝试使用我的apache-arrow文件中的以下部分构建并链接到v9.0.0项目中的cmake项目。

代码语言:javascript
复制
ExternalProject_Add(arrow
        URL "https://www.apache.org/dist/arrow/arrow-9.0.0/apache-arrow-9.0.0.tar.gz"
        SOURCE_SUBDIR cpp)
message(STATUS "arrow source dir: ${arrow_SOURCE_DIR}")
include_directories(${arrow_SOURCE_DIR}/cpp/src)

编译会抱怨缺少apache-arrow头。

代码语言:javascript
复制
fatal error: 'arrow/array.h' file not found
#include <arrow/array.h>
         ^~~~~~~~~~~~~~~
1 error generated.

message(STATUS "arrow source dir: ${arrow_SOURCE_DIR}")输出为空的事实所支持

代码语言:javascript
复制
-- arrow source dir: 

另一个与cmake报告的cmake安装有关的错误是:

代码语言:javascript
复制
CMake Error at cmake_modules/ThirdpartyToolchain.cmake:267 (find_package):
  Could not find a configuration file for package "xsimd" that is compatible
  with requested version "8.1.0".

  The following configuration files were considered but not accepted:

    /opt/homebrew/lib/cmake/xsimd/xsimdConfig.cmake, version: 9.0.1

Call Stack (most recent call first):
  cmake_modules/ThirdpartyToolchain.cmake:2245 (resolve_dependency)
  CMakeLists.txt:575 (include)

当然,在外部安装apache-arrow并使用brew install apache-arrowfind_package的传统方法工作得很好,但我想要的是更跨平台的东西。其中一个箭头开发者提供了一个链接,说明如何将include_directoriesExternalProject_Add一起正确地用于先前的问题,但我想这个示例现在已经过时了。

使用apache-arrow安装并链接到cmake项目中的ExternalProject_Add的推荐方法是什么?

编辑:最小示例

CMakeLists.txt

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.24)
project(arrow_cmake)

set(CMAKE_CXX_STANDARD 23)

include(ExternalProject)

ExternalProject_Add(Arrow
        URL "https://www.apache.org/dist/arrow/arrow-9.0.0/apache-arrow-9.0.0.tar.gz"
        SOURCE_SUBDIR cpp
        CMAKE_ARGS "-Dxsimd_SOURCE=BUNDLED"
        )
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} arrow_shared)

main.cpp

代码语言:javascript
复制
#include <iostream>

#include <arrow/array.h> // not found!

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-04 13:45:23

cmake中从源代码构建箭头花费了相当多的精力。它受到此链接的严重影响。

cmake/arrow.cmake

代码语言:javascript
复制
# Build the Arrow C++ libraries.
function(build_arrow)
    set(one_value_args)
    set(multi_value_args)

    cmake_parse_arguments(ARG
            "${options}"
            "${one_value_args}"
            "${multi_value_args}"
            ${ARGN})
    if (ARG_UNPARSED_ARGUMENTS)
        message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}")
    endif ()

    # If Arrow needs to be built, the default location will be within the build tree.
    set(ARROW_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/arrow_ep-prefix")

    set(ARROW_SHARED_LIBRARY_DIR "${ARROW_PREFIX}/lib")

    set(ARROW_SHARED_LIB_FILENAME
            "${CMAKE_SHARED_LIBRARY_PREFIX}arrow${CMAKE_SHARED_LIBRARY_SUFFIX}")
    set(ARROW_SHARED_LIB "${ARROW_SHARED_LIBRARY_DIR}/${ARROW_SHARED_LIB_FILENAME}")
    set(PARQUET_SHARED_LIB_FILENAME
            "${CMAKE_SHARED_LIBRARY_PREFIX}parquet${CMAKE_SHARED_LIBRARY_SUFFIX}")
    set(PARQUET_SHARED_LIB "${ARROW_SHARED_LIBRARY_DIR}/${PARQUET_SHARED_LIB_FILENAME}")

    set(ARROW_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/arrow_ep-build")
    set(ARROW_CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${ARROW_PREFIX}"
            "-DCMAKE_INSTALL_LIBDIR=lib" "-Dxsimd_SOURCE=BUNDLED"
            "-DARROW_BUILD_STATIC=OFF" "-DARROW_PARQUET=ON"
            "-DARROW_WITH_UTF8PROC=OFF" "-DARROW_WITH_RE2=OFF"
            "-DARROW_FILESYSTEM=ON" "-DARROW_CSV=ON" "-DARROW_PYTHON=ON")
    set(ARROW_INCLUDE_DIR "${ARROW_PREFIX}/include")

    set(ARROW_BUILD_BYPRODUCTS "${ARROW_SHARED_LIB}" "${PARQUET_SHARED_LIB}")

    include(ExternalProject)

    externalproject_add(arrow_ep
            URL https://github.com/apache/arrow/archive/refs/tags/apache-arrow-9.0.0.tar.gz
            SOURCE_SUBDIR cpp
            BINARY_DIR "${ARROW_BINARY_DIR}"
            CMAKE_ARGS "${ARROW_CMAKE_ARGS}"
            BUILD_BYPRODUCTS "${ARROW_BUILD_BYPRODUCTS}")

    set(ARROW_LIBRARY_TARGET arrow_shared)
    set(PARQUET_LIBRARY_TARGET parquet_shared)

    file(MAKE_DIRECTORY "${ARROW_INCLUDE_DIR}")
    add_library(${ARROW_LIBRARY_TARGET} SHARED IMPORTED)
    add_library(${PARQUET_LIBRARY_TARGET} SHARED IMPORTED)
    set_target_properties(${ARROW_LIBRARY_TARGET}
            PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${ARROW_INCLUDE_DIR}
            IMPORTED_LOCATION ${ARROW_SHARED_LIB})
    set_target_properties(${PARQUET_LIBRARY_TARGET}
            PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${ARROW_INCLUDE_DIR}
            IMPORTED_LOCATION ${PARQUET_SHARED_LIB})

    add_dependencies(${ARROW_LIBRARY_TARGET} arrow_ep)
endfunction()

在您的CMakeLists.txt文件中使用它作为

代码语言:javascript
复制
...
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
include(arrow)
build_arrow()
票数 1
EN

Stack Overflow用户

发布于 2022-10-03 14:33:37

你能试着强迫Arrow构建系统下载并使用捆绑的xsimd吗?我已经能够复制并且能够在当地建造。

代码语言:javascript
复制
ExternalProject_Add(Arrow
    URL "https://www.apache.org/dist/arrow/arrow-9.0.0/apache-arrow-9.0.0.tar.gz"
    SOURCE_SUBDIR cpp
    CMAKE_ARGS "-Dxsimd_SOURCE=BUNDLED"
)

我认为我们目前还没有它的文档,我们假设在文档中使用find_package:system.html。也许我们可以打开一张票来改进文档,以便将它与CMake的ExternalProject或FetchContent一起使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73935448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档