Boost python链接

12

我正在为我的游戏添加boost.python库。我编写包装器来在脚本中使用我的类。问题是将该库链接到我的应用程序上。我正在使用cmake构建系统。

现在我有一个简单的应用程序,只有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中实现这一点?

我在主要的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 调用了 show:

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

因此它不需要包含所有需要的目录。

第二个问题:

如何组织脚本cpp文件的两步构建? 在我展示的makefile中有TARGET.o和TARGET.so,如何在cmake中处理这2个命令?

据我所了解,最好的方法是创建子项目并在其中执行某些操作。

谢谢。

1个回答

18

您在CMakeList.txt中缺少Python的包含目录和库。使用PythonFindLibs宏或与您为Boost使用的相同的find_package策略。

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} # <------
    ...
)
...

如果我的项目需要跨平台怎么办?这行代码在Windows上无法运行。 - Max Frai
抱歉!我本想点赞,结果按了踩。非常抱歉。我认为你应该发布原创的、非跨平台的答案。我会使用一些 Python/Cython/C 的东西,而我关心的只有效率(在这个项目中)。再次对我的愚蠢鼠标表示歉意(我知道,只有用户是愚蠢的,工具从来不会……)。 - cox
@cox已经为您修复了这个问题 :) - Ilia K.
@cox 访问编辑历史记录以查看更改内容。我只是将路径更改为平台无关的,而不是基于Unix的。 - Rod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接