【问题标题】:C++ including Python.h compiling using makefileC++ 包括 Python.h 使用 makefile 编译
【发布时间】:2021-12-19 17:22:32
【问题描述】:

我正在尝试编译一个使用Python.h 执行一些python 脚本的C++ 程序。在添加 python 之前,我有一个运行良好的 makefile。我添加了运行python脚本的代码,其中包括Python.h文件。

我编辑了 makefile 以包含这个文件,但没有成功。

我的生成文件:

CC          = g++
SHELL       = /bin/sh
EXECUTABLES = Software_V2
CFLAGS      += -O2 -g0 -Wall -pedantic -Wstrict-prototypes -std=c99 $(shell python3-config --cflags)
LIBS         = -lm -lrt -laes_access -lstdc++ -pthread

OBJS = $(EXECUTABLES).o 

.PHONEY: all
all:    $(EXECUTABLES)

.PHONEY: clean
clean:
    rm -f *.[bo]
    rm -f *.err
    rm -f $(EXECUTABLES)

$(EXECUTABLES): $(OBJS)
        $(CC) $(OBJS) $(CFLAGS) $(LIBS) -o $@

我已经安装了以下库:

  • sudo apt-get install python-dev
  • sudo apt-get install python3-dev
  • sudo apt install libpython3.7-dev

运行make后的错误我收到以下错误:

g++    -c -o Software_V2.o Software_V2.cpp
Software_V2.cpp:3:10: fatal error: Python.h: No such file or directory
 #include <Python.h>
          ^~~~~~~~~~
compilation terminated.
make: *** [<builtin>: Software_V2.o] Error 1

我还尝试将包含从 #include &lt;Python.h&gt; 更改为 #include &lt;python3.7m/Python.h&gt;

我的尝试都没有成功,我现在没有灵感去尝试一些新事物,也许你们知道如何解决我的问题。谢谢!

【问题讨论】:

  • 检查 python3-config --cflags 是否符合您的预期。检查 -I 目录以确保文件位于其中一个目录中。

标签: python c++ linux makefile


【解决方案1】:

您正在混合使用 C 和 C++。这些是完全不同的语言:您不应该混淆它们。

在 makefile 中,默认规则使用 CC 保存 C 编译器,使用 CXX 保存 C++ 编译器。同样,他们使用CFLAGS 保存 C 编译器的标志,使用 CXXFLAGS 保存 C++ 编译器的标志。

在您的makefile 中,您没有设置CXXCXXFLAGS 变量,但您正在尝试使用默认规则来构建您的目标文件。 CXX 的默认值为 g++(在您的系统上),CXXFLAGS 的默认值为空。这就是为什么当 make 向您显示编译命令时,您的选项都没有出现在那里:

 g++    -c -o Software_V2.o Software_V2.cpp

如果您尝试编译 C++ 代码(这意味着您的文件扩展名是 .cpp 而不是 .c),那么您应该设置 CXXFLAGS 而不是 CFLAGS

另外,如果你试图编译 C++,设置 -std=c99 是错误的;该标志设置了 C 1999 标准,而不是 C++。

【讨论】:

  • 另外,您不应该将-lc++ 添加到您的链接行。如果您与g++ 前端链接,那么它将自动在正确的位置添加 C++ STL 库。通过专门添加它,您可能会做错。
  • 谢谢,我从头开始重写makefile。这为我解决了问题!
【解决方案2】:

试试include "Python.h" - 当你使用时,预编译器会在一组不同的目录中查找。

同时在命令行上运行 python3-config --cflags 并确保它为您提供正确的包含目录 - Python.h 文件应该在其中之一中。

最终,问题是在预编译器检查的标准目录中找不到该文件,也没有在您指定的目录中找到该文件(使用 -I 选项)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多