2016-11-11 1 views
2

OS X에서이 예제를 boost python with cmake 시도하고 있습니다. 게시물이 조금 오래되었지만 더 새로운 것을 찾을 수 없습니다. 제 목표는 CMake를 사용하는 것입니다 (왜냐하면 CLion을 사용하기 때문에) C++과 Python 라이브러리의 통합 프로젝트를 빌드하는 것입니다. 나는 OS X에 파이썬 2.7을 사용하고OS X에서 CMake와 함께 Boost Python 사용

내 .cpp 파일이

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() 

마지막으로

#include <boost/python.hpp> 

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

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

내 CMakesLists.txt, 난 파이썬 콘솔을 열고이

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 

C++과 Python을 통합하기위한이 전체 접근법이 구식인지, (b)이 오류가 나와 말해야하는지, (c) CMake를 사용하는 다른 접근법에 대한 지침을 알려 주시면 감사하겠습니다.

답변

1

키가 내 파이썬 버전이 make가 생성 한 .dylib 파일을로드하는 데 문제가있는 것으로 보입니다. 난 이유를 모르겠어, 그래서 CMakeLists.txt 파일에서이 트릭을 사용하고 난 파이썬 쉘을 열고 실행 할 수 있었다 cmakemake을 수행 한 후 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 "") 

을 포함

import greet_ext 
greet_ext.greet() 

github에 대한 전체 예제를 게시했습니다. 또한 나는 Feral Chicken에게 a useful post

을 감사해야했다.