簡體   English   中英

python / c ++ - 使用cmake編譯共享庫並使用distutils進行安裝

[英]python/c++ - Compiling shared library with cmake and installing with distutils

我有一個boost.python項目,我使用cmake和make編譯。 它是python模塊的一部分,我希望能夠使用distutils安裝該模塊。 我按照這里的說明創建了一個CMakeLists.txt文件,該文件首先編譯共享庫,然后設置setup.py,以便make install安裝python模塊。 但是,雖然所有python文件都被distutils識別並移動到構建目錄,但共享庫卻沒有,我真的不知道為什么。

我的項目目錄結構:

  • 項目
    • build(python distutils目錄)
    • doc(模塊文檔)
    • 模塊(主模塊目錄)
      • 核心(升級項目/庫的目錄)
        • CMakeLists.txt - 構建共享庫
      • other_py_files(純python文件的幾個目錄)
    • 的CMakeLists.txt
    • setup.py.in
    • setup.py(由cmake生成)

我的setup.py.in文件:

from distutils.core import setup
setup(
    name='module',
    version='${PACKAGE_VERSION}',
    packages=['module', 'module.core', 'module.other_py_files'],
    package_dir={'': '${CMAKE_CURRENT_SOURCE_DIR}'},
)

我的CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (module)

add_subdirectory(module/core)

find_program(PYTHON "python")

if (PYTHON)
  set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
  set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
  set(DEPS "${CMAKE_CURRENT_SOURCE_DIR}/pyQCD/__init__.py")
  set(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/build/timestamp")

  configure_file(${SETUP_PY_IN} ${SETUP_PY})

  add_custom_command(OUTPUT ${OUTPUT}
    COMMAND ${PYTHON} ${SETUP_PY} build
    COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT}
    DEPENDS ${DEPS})

  add_custom_target(target ALL DEPENDS ${OUTPUT})

  install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY} install)")

endif()

我認為distutils應該自動添加共享庫擴展來構建目錄,或者我在某個地方出錯了? (共享庫是一個基於C api(boost.python)構建的可導入的python模塊,所以它應該可以工作嗎?)

最后,我按照這里的答案並覆蓋了build_ext命令。 因為我希望構建是跨平台的,並且由於共享庫位於模塊源代碼樹內,因此我導入模塊共享庫add使用file屬性從setup.py獲取共享庫的路徑。

scikit-build是一個自定義的setup實現,它取代了distutils.core.Extension並使用cmake來編譯源代碼。 可在此處找到各種示例項目。 在你使用的情況下Pybind11 ,還有使用另一個簡單的例子在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM