Усиление ссылок на Python - PullRequest
12 голосов
/ 08 марта 2011

Я добавляю boost.python для моей игры.Я пишу обертки для своих классов, чтобы использовать их в сценариях.Проблема связана с привязкой этой библиотеки к моему приложению.Я использую cmake build system.

Теперь у меня есть простое приложение с 1 файлом и makefile для него:

PYTHON = /usr/include/python2.7

BOOST_INC = /usr/include
BOOST_LIB = /usr/lib

TARGET = main

$(TARGET).so: $(TARGET).o
    g++ -shared -Wl,--export-dynamic \
    $(TARGET).o -L$(BOOST_LIB) -lboost_python \
    -L/usr/lib/python2.7/config -lpython2.7 \
    -o $(TARGET).so

$(TARGET).o: $(TARGET).cpp
    g++ -I$(PYTHON) -I$(BOOST_INC) -c -fPIC $(TARGET).cpp

И это работает.Он создает для меня файл 'so', который я могу импортировать из python.

Теперь вопрос: как получить это для cmake?

Я написал в main CMakeList.txt:

...
find_package(Boost COMPONENTS filesystem system date_time python REQUIRED)
message("Include dirs of boost: " ${Boost_INCLUDE_DIRS} )
message("Libs of boost: " ${Boost_LIBRARIES} )

include_directories(
    ${Boost_INCLUDE_DIRS}
        ...
)

target_link_libraries(Themisto
    ${Boost_LIBRARIES}
    ...
)
...

message Показ вызовов:

Include dirs of boost: /usr/include
Libs of boost: /usr/lib/libboost_filesystem-mt.a/usr/lib/libboost_system-mt.a/usr/lib/libboost_date_time-mt.a/usr/lib/libboost_python-mt.a

Хорошо, поэтому я добавил простой .cpp-файл для моего проекта с включением <boost/python.hpp>.Я получаю сообщение об ошибке при компиляции:

/usr/include/boost/python/detail/wrap_python.hpp:50:23: fatal error: pyconfig.h: No such file or directory

Так что не нужно все включать каталоги.

И секунда вопрос:

Какорганизовать двухэтапное построение файлов script-cpp?В makefile, который я показал, есть TARGET.o и TARGET.so , как обрабатывать эти 2 команды в cmake?

Как я понимаю, лучший способ этосоздайте подпроект и сделайте что-нибудь там.

Спасибо.

1 Ответ

18 голосов
/ 09 марта 2011

Вам не хватает вашего каталога include и библиотек для python в вашем CMakeList.txt.Используйте макрос PythonFindLibs или ту же стратегию find_package, которую вы использовали для Boost

find_package(Boost COMPONENTS filesystem system date_time python REQUIRED)
message("Include dirs of boost: " ${Boost_INCLUDE_DIRS} )
message("Libs of boost: " ${Boost_LIBRARIES} )

find_package(PythonLibs REQUIRED)
message("Include dirs of Python: " ${PYTHON_INCLUDE_DIRS} )
message("Libs of Python: " ${PYTHON_LIBRARIES} )

include_directories(
    ${Boost_INCLUDE_DIRS}
    ${PYTHON_INCLUDE_DIRS}  # <-------
        ...
)

target_link_libraries(Themisto
    ${Boost_LIBRARIES}
    ${PYTHON_LIBRARIES} # <------
    ...
)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...