在OS X上将Boost Python与CMake结合使用

布赖恩·多兰(Brian Dolan)

我正在OS X上使用cmake示例尝试这种增强型python。帖子有点旧,但是我找不到更新的内容。我的目标是使用CMake(因为我正在使用CLion)来构建C ++和Python库的集成项目。我在OS X上使用Python 2.7

我的.cpp文件是

#include <boost/python.hpp>

char const* yay()
{
  return "Yay!";
}

BOOST_PYTHON_MODULE(libyay)
{
  using namespace boost::python;
  def("yay", yay);
}

我的CMakesLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.3)
IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE "DEBUG")
  #SET(CMAKE_BUILD_TYPE "RELEASE")
  #SET(CMAKE_BUILD_TYPE "RELWITHDEBINFO")
  #SET(CMAKE_BUILD_TYPE "MINSIZEREL")
ENDIF()

FIND_PACKAGE(PythonLibs 2.7 REQUIRED)

FIND_PACKAGE(Boost)
IF(Boost_FOUND)
  INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}" "/usr/include/python2.7")
  SET(Boost_USE_STATIC_LIBS OFF)
  SET(Boost_USE_MULTITHREADED ON)
  SET(Boost_USE_STATIC_RUNTIME OFF)
  FIND_PACKAGE(Boost COMPONENTS python)

  ADD_LIBRARY(yay SHARED yay.cpp)
  TARGET_LINK_LIBRARIES(yay ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
ELSEIF(NOT Boost_FOUND)
  MESSAGE(FATAL_ERROR "Unable to find correct Boost version. Did you set BOOST_ROOT?")
ENDIF()


IF(CMAKE_COMPILER_IS_GNUCXX)
  ADD_DEFINITIONS("-Wall")
ELSE()
  SET(CMAKE_CXX_FLAGS "-Wall")
  MESSAGE("You have compiler " ${CMAKE_CXX_COMPILER_ID})
  #MESSAGE(FATAL_ERROR "CMakeLists.txt has not been tested/written for your compiler.")
  MESSAGE("CMakeLists.txt has not been tested/written for your compiler.")
ENDIF()

最后,我打开一个Python控制台并尝试执行此操作

from ctypes import *
ly = cdll.LoadLibrary("libyay.dylib")
print ly.yay()

产生此错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 375, in __getattr__
    func = self.__getitem__(name)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 380, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: dlsym(0x7fdb5344aec0, yay): symbol not found

对于以下方面的指导,我将不胜感激:(a)用于集成C ++和Python的整个方法是否过时;(b)该错误应该告诉我什么;以及(c)使用CMake的其他方法。

布赖恩·多兰(Brian Dolan)

关键似乎是我的Python版本在加载.dylibmake生成文件时遇到问题我不知道为什么,所以我在CMakeLists.txt文件中使用了这个技巧,并包含了if(APPLE)命令

cmake_minimum_required( VERSION 3.3 )
project( BoostPythonHelloWorld )

# Make a .so output!
if(APPLE)
set(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
endif(APPLE)

# Find necessary packages
find_package( PythonLibs 2.7 REQUIRED )
include_directories( ${PYTHON_INCLUDE_DIRS} )

find_package( Boost COMPONENTS python REQUIRED )
include_directories( ${Boost_INCLUDE_DIR} )

# Build our library
add_library( greet SHARED greet.cpp )

# Define the wrapper library that wraps our library
add_library( greet_ext SHARED greet_ext.cpp )
target_link_libraries( greet_ext ${Boost_LIBRARIES} ${PYTHON_LIBRARIES} greet )
# don't prepend wrapper library name with lib
set_target_properties( greet_ext PROPERTIES PREFIX "" )

完成后cmakemake我能够打开Python Shell并运行

import greet_ext
greet_ext.greet()

我已经在github上发布了一个完整的示例我也要感谢Feral Chicken的有用帖子

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Mac OS X上将Python3与CMake链接

CMake在带有brew的OS X上找不到Boost

如何在OS X上将Python的默认版本设置为3.x?

使用 Tomcat 在 Mac OS X 上将 Lucee 设置为开发环境

SWT:如何在OS X上将Program.launch()与参数一起使用?

如何在OS X上将Boehm GC与GCC的__attribute __((section ...))一起使用?

在Intel Mac OS X上将PATH AMPL求解器与Pyomo一起使用

无法在OS X上针对Boost.Python进行链接

使用cmake发行C ++包的问题:使用Python .dylib,使用2.7而不是3.8,OS X

架构x86_64的未定义符号:OS X,Boost Log,CMake

Mac OS X上的MetaTrader 4与C ++或R结合使用

cmake检查Mac OS X,使用APPLE还是$ {APPLE}

在Mac OS X上将屏幕外窗口移回屏幕

在Mac OS X上将键映射到vimrc中的<Esc>

在OS X 10.10上将Prolog模式安装到Aquamacs

在OS X 10.7.5 Lion上将PHP升级到5.4.14

在OS X上将文件名解析为touch命令

在Linux上将Spyder与Python 2.7和Python 3结合使用

当在线程中使用system()时,为什么在Mac OS X上将多线程C程序强制到单个CPU?

将CMake移植到OS X Yosemite

在Mac OS上将Python 3设置为默认设置?

在Mac OS上将OpenMP与C ++ 11一起使用

凌乱的Python安装?(OS X)

Mac OS X上的Python

从OS X使用DualShock 4

如何在Windows 10 Bash上将X Windows与Emacs结合使用?

如何在Windows和CMake上使用Visual Studio编译Mac OS X的C ++

如何在Mac OS X上使CMake使用GCC而不是Clang?

如何在Mac OS X上将.jar文件添加到类路径中?