python运行c语言文件,从Cmake的find_程序保存可执行文件,以便Python可以运行它

我试图把C++和Python结合起来,为此我使用CMake。在CMakeLists.txt文件,我试图找到一个程序:# Check for Gmsh executable

find_program (GMSH gmsh [/Applications/Gmsh.app/Contents/MacOS/ /usr/bin/ /usr/local/bin/])

if(GMSH)

message(STATUS "Found Gmsh in: ${GMSH}")

set(HAVE_GMSH YES)

else()

set(HAVE_GMSH NO)

endif()

message(STATUS "Setting HAVE_GMSH to: ${HAVE_GMSH}")

这样就可以在没有问题的情况下找到可执行文件。但不知怎么的,我必须把它保存在某个地方,以便以后可以从Python调用它。这应该在配置文件中完成吗?正确的方法是什么?在

更新

我创建了一个文件项目配置.cmake.in包括以下内容:

^{pr2}$

以及CMakeLists.txt文件文件如下所示:cmake_minimum_required(VERSION 3.1)

project(TestProject)

enable_language(CXX)

# Options

# Offer the user the choice of overriding the installation directories

set(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")

set(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")

set(INSTALL_INCLUDE_DIR include CACHE PATH

"Installation directory for header files")

if(WIN32 AND NOT CYGWIN)

set(DEF_INSTALL_CMAKE_DIR CMake)

else()

set(DEF_INSTALL_CMAKE_DIR lib/CMake/Project)

endif()

set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH

"Installation directory for CMake files")

# Make relative paths absolute (needed later on)

foreach(p LIB BIN INCLUDE CMAKE)

set(var INSTALL_${p}_DIR)

if(NOT IS_ABSOLUTE "${${var}}")

set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")

endif()

endforeach()

# Check for Gmsh executable

find_program (GMSH gmsh [/Applications/Gmsh.app/Contents/MacOS/ /usr/bin/ /usr/local/bin/])

if(GMSH)

message(STATUS "Found Gmsh in: ${GMSH}")

set(HAVE_GMSH YES)

else()

set(HAVE_GMSH NO)

endif()

message(STATUS "Setting HAVE_GMSH to: ${HAVE_GMSH}")

# Python support

#

# find Python

find_package(PythonInterp)

# find SWIG

find_package(SWIG REQUIRED)

include(${SWIG_USE_FILE})

find_package(PythonLibs)

include_directories(${PYTHON_INCLUDE_PATH})

message(STATUS "PYTHON_INCLUDE_PATH: ${PYTHON_INCLUDE_PATH}")

message(STATUS "PYTHON_LIBRARIES: ${PYTHON_LIBRARIES}")

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/core)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/core/fem)

#set(CMAKE_SWIG_OUTDIR ${PROJECT_BINARY_DIR}/../lib/project)

SET_SOURCE_FILES_PROPERTIES(swig/core.i PROPERTIES CPLUSPLUS ON)

set_source_files_properties(swig/core.i SWIG_FLAGS "-includeall;-c++;-shadow")

swig_add_module(core python swig/core.i core/foo.cpp)

swig_link_libraries(core project_core ${PYTHON_LIBRARIES})

################################################################################

# Directories

#

# set up include-directories

include_directories(

"${PROJECT_SOURCE_DIR}" # to find core/foo.hpp

"${PROJECT_BINARY_DIR}") # to find core/config.hpp

# Add sub-directories

add_subdirectory(core)

add_subdirectory(bar)

# The interesting stuff goes here

# ===============================

# Add all targets to the build-tree export set

export(TARGETS project_core bar

FILE "${PROJECT_BINARY_DIR}/ProjectTargets.cmake")

# Export the package for use from the build-tree

# (this registers the build-tree with a global CMake-registry)

export(PACKAGE Project)

# Create the ProjectConfig.cmake and ProjectConfigVersion files

file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}"

"${INSTALL_INCLUDE_DIR}")

# ... for the build tree

set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}")

configure_file(ProjectConfig.cmake.in

"${PROJECT_BINARY_DIR}/ProjectConfig.cmake" @ONLY)

# ... for the install treew

set(CONF_INCLUDE_DIRS "\${PROJECT_CMAKE_DIR}/${REL_INCLUDE_DIR}")

configure_file(ProjectConfig.cmake.in

"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/ProjectConfig.cmake" @ONLY)

# ... for both

configure_file(ProjectConfigVersion.cmake.in

"${PROJECT_BINARY_DIR}/ProjectConfigVersion.cmake" @ONLY)

# Install the ProjectConfig.cmake and ProjectConfigVersion.cmake

install(FILES

"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/ProjectConfig.cmake"

"${PROJECT_BINARY_DIR}/ProjectConfigVersion.cmake"

DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev)

# Install the export set for use with the install-tree

install(EXPORT ProjectTargets DESTINATION

"${INSTALL_CMAKE_DIR}" COMPONENT dev)

现在我不确定结果配置文件的位置(在${PROJECT_BINARY_DIR})是否是放置它的正确位置。我应该把它放在整个层次结构的根上吗?这是一个大型项目,其结构如下:├── AUTHORS.rst

├── CHANGELOG.rst

├── CONTRIBUTING.rst

├── LICENSE

├── MANIFEST.in

├── Makefile

├── README.rst

├── core

│   ├── CMakeLists.txt

│   ├── ProjectConfig.cmake.in

│   ├── ProjectConfigVersion.cmake.in

│   ├── Makefile

│   ├── bar

│   ├── core

│   └── swig

├── setup.cfg

├── setup.py

├── src

│   └── project

├── tests

│   └── unit

└── tox.ini

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于使用 CMake 生成可供其他 CMake 文件 `find_package()` 的库文件的问题。下面是一个简单的步骤: 1. 编写 CMakeLists.txt 文件,定义要生成的库文件。 ```cmake # 定义要生成的库文件名称和源文件 add_library(mylib mylib.cpp) # 定义头文件路径 target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) # 导出库文件的头文件和库文件 include(GNUInstallDirs) install(TARGETS mylib EXPORT mylib-config LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) install(EXPORT mylib-config NAMESPACE mylib:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/mylib FILE mylib-config.cmake) ``` 2. 在 CMakeLists.txt 文件中设置库文件的属性。 ```cmake # 设置库文件属性 set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1 PUBLIC_HEADER include/mylib.h ) ``` 3. 生成配置文件 ```cmake # 生成配置文件 include(CMakePackageConfigHelpers) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/mylib-config-version.cmake" VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion ) configure_package_config_file( "${CMAKE_CURRENT_LIST_DIR}/mylib-config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/mylib-config.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/mylib" ) # 安装配置文件 install( FILES "${CMAKE_CURRENT_BINARY_DIR}/mylib-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/mylib-config-version.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/mylib" ) ``` 4. 在其他 CMakeLists.txt 文件中使用生成的库文件。 ```cmake # 查找库文件 find_package(mylib REQUIRED) # 添加库文件路径 link_directories(${mylib_LIBRARY_DIRS}) # 添加库文件 add_executable(myapp main.cpp) target_link_libraries(myapp ${mylib_LIBRARIES}) ``` 以上就是一个简单的使用 CMake 生成可供其他 CMake 文件 `find_package()` 的库文件的步骤。希望能够帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值