【问题标题】:Compliing C++ CGAL Module that is callable from Python编译可从 Python 调用的 C++ CGAL 模块
【发布时间】:2013-10-12 09:16:00
【问题描述】:

我正在尝试编译一些要从 Python 调用然后调用 CGAL 的 C++ 代码。

我需要能够在编译时指定一些标志,但不确定如何执行此操作,因为构建过程是

./CGAL-4.2/scripts/cgal_create_CMakeLists -s CallGCAL

cmake -DCGAL_DIR=./CGAL-4.2 .

make

而且我不想手动编辑 Makefile 或 CMakeLists

我从上面得到的没有标志告诉 gcc 它需要 Python 的错误消息是

CMakeFiles/CallGCAL.dir/CallGCAL.cpp.o: In function `initmyModule()':
CallGCAL.cpp:(.text+0x5e): undefined reference to `Py_InitModule4'
CMakeFiles/CallGCAL.dir/CallGCAL.cpp.o: In function `py_polygon(_object*, _object*)':
CallGCAL.cpp:(.text+0x86): undefined reference to `Py_BuildValue'
CMakeFiles/CallGCAL.dir/CallGCAL.cpp.o: In function `py_hull(_object*, _object*)':
CallGCAL.cpp:(.text+0xa6): undefined reference to `Py_BuildValue'
collect2: ld returned 1 exit status

【问题讨论】:

    标签: c++ python cgal


    【解决方案1】:

    好的解决了!!!必须将变量传递给 cmake。

    工作脚本如下。

    ./CGAL-4.2/scripts/cgal_create_CMakeLists -s CallCGAL

    cmake -DCGAL_DIR=./CGAL-4.2 -DCGAL_CXX_FLAGS="-shared -fPIC" .

    制作

    rm -f CallCGAL.so

    mv CallCGAL CallCGAL.so

    【讨论】:

      【解决方案2】:

      我是否正确理解您想要借助 CGAL 附带的 makefile 编译您自己的代码,该代码同时使用 Python 和 CGAL?

      显然不可能,因为 CGAL makefile 无法了解 Python。您必须编写自己的makefile,它可以基于一些现有的makefile,但也了解Phython。您报告的错误是由无法找到 Python 库来解析某些符号的加载程序生成的。因此,您需要添加到 makefile 中的只是相关的 -l-L 选项。

      【讨论】:

      • 不完全。我想编译我自己的从 Python 调用但用 C++ 编写并调用 CGAL 的代码。 CGAL 不直接提供 Makefile。它提供了各种脚本来制作 Cmake 用来制作 Makefile 的 CMAKEText 文件。从那以后,我在cgal.org/Manual/latest/doc_html/installation_manual/… 找到了有关各种编译器链接器标志的文档,但我对 CMAKE 或 CGAL 脚本知之甚少,不知道我应该在哪里设置这些变量。
      • 您参考的手册是构建 CGAL 库(以及示例和演示)的手册。它不是使用 CGAL 构建其他软件的通用手册。
      【解决方案3】:

      cgal_create_CMakeLists 创建的 CMakeLists.txt 根本不是为您的用例设计的。创建的CMakeLists.txt 试图编译一个可执行文件,而您想创建一个模块。在CMakeLists.txt 中,替换以下行:

      create_single_source_cgal_program(CallCGAL.cpp)
      

      作者:

      add_library(CallCGAL MODULE CallCGAL.cpp)
      target_link_libraries(CallCGAL ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} )
      

      这样,CMake 将创建正确的 Makefile,无需重命名文件,或调整编译和链接标志。

      【讨论】:

      • 谢谢,但这意味着当我分发我的代码时,我必须让人们修改 CGAL 脚本。想我宁愿只分发我的编译脚本,即使有点 hacky
      • 通常的做法是使用代码分发一个跨平台的 CMakeLists.txt。这就是我们在 CGAL 中所做的。
      • 还请注意,您可以使用 CGAL 构建模块,而无需使用 CMake 对其进行配置。但是你必须自己实现一个构建系统。 CMake 只是一种为给定软件创建构建系统的跨平台方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 2021-04-26
      • 1970-01-01
      • 2012-03-14
      • 2019-12-27
      • 1970-01-01
      相关资源
      最近更新 更多