链接嵌入 Python 的 C++ 目标文件
Linking C++ object files embedded with Python
我有一个头文件 formatting_SQ.h
的 C++ 构造函数文件 (formatting_SQ.cpp
),我想 link 到头文件 (neat.cpp nnode.cpp link.cpp etc...-> neat.h nnode.h link.h
) 的其他构造函数文件为了 formatting_SQ.o
.
然后,我想 link 我的 main.cpp 文件和这个 formatting_SQ.o
文件。问题是:formatting_SQ
嵌入了 python,据我了解,嵌入了 Python 的 C++ 需要 Linux 上的编译标志 -lpython3.6m
:这样的标志需要引用 main()
函数,我在 formatting_SQ.cpp
中没有,因为它是一个构造函数文件,意味着是一个目标文件。
所以我首先尝试为每个构造函数文件创建目标文件,然后link所有东西一起一次:
g++ -c -O3 -Wall -fPIC -fopenmp -std=c++14 -lstdc++ `python3 -m pybind11 --includes` *.cpp
g++ -o the_executable neat.o nnode.o link.o trait.o gene.o network.o innovation.o organism.o species.o genome.o population.o formatting_SQ.o main.o -fopenmp -O3 -Wall -fPIC `python3 -m pybind11 --includes` -lpython3.6m
我的第一个问题来了:这些命令是正确的还是最终缺少编译标志?当我尝试执行 ./the_executable
.
时,这给了我一个分段错误
然后,我尝试用所有其他构造函数文件独立编译 formatting_SQ.cpp
,但正如预期的那样,这不起作用,因为在 formatting_SQ.cpp
.[=29= 中没有对 main 的引用]
g++ -o temp_formatting neat.o nnode.o link.o trait.o gene.o network.o innovation.o organism.o species.o genome.o population.o formatting_SQ.o -fopenmp -O3 -Wall -fPIC `python3 -m pybind11 --includes` -lpython3.6m
所以我的第二个问题来了:我如何创建一个 python 嵌入式目标文件 linking formatting_SQ.cpp
与所有其他构造函数文件 没有 有这个 undefined reference to main
错误?
formatting_SQ.cpp
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <Python.h>
#include <omp.h>
#include "formatting_SQ.h"
#include "neat.h"
#include "network.h"
#include "link.h"
#include "nnode.h"
#include "trait.h"
#include "gene.h"
#include "genome.h"
#include "innovation.h"
#include "organism.h"
#include "species.h"
#include "population.h"
namespace py = pybind11;
py::module compile_data = py::module::import("initialize");
main.cpp
#include <pybind11/embed.h>
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <Python.h>
#include "formatting_SQ.h"
#include <omp.h>
namespace py = pybind11;
int main(int argc, char** argv){
....
因此,经过长时间的研究,我可以得出结论,编译方法是正确的,但要格外小心从 python 声明导入模块的位置,因为这对我来说是个问题
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <Python.h>
#include <omp.h>
#include "formatting_SQ.h"
#include "neat.h"
#include "network.h"
#include "link.h"
#include "nnode.h"
#include "trait.h"
#include "gene.h"
#include "genome.h"
#include "innovation.h"
#include "organism.h"
#include "species.h"
#include "population.h"
namespace py = pybind11;
py::module compile_data = py::module::import("initialize"); DON'T DO THIS its wrong !!!
您必须在本地声明您的模块,否则命名空间中会出现一些冲突,因为同一个模块可能会被多次导入,这会导致分段错误。
我有一个头文件 formatting_SQ.h
的 C++ 构造函数文件 (formatting_SQ.cpp
),我想 link 到头文件 (neat.cpp nnode.cpp link.cpp etc...-> neat.h nnode.h link.h
) 的其他构造函数文件为了 formatting_SQ.o
.
然后,我想 link 我的 main.cpp 文件和这个 formatting_SQ.o
文件。问题是:formatting_SQ
嵌入了 python,据我了解,嵌入了 Python 的 C++ 需要 Linux 上的编译标志 -lpython3.6m
:这样的标志需要引用 main()
函数,我在 formatting_SQ.cpp
中没有,因为它是一个构造函数文件,意味着是一个目标文件。
所以我首先尝试为每个构造函数文件创建目标文件,然后link所有东西一起一次:
g++ -c -O3 -Wall -fPIC -fopenmp -std=c++14 -lstdc++ `python3 -m pybind11 --includes` *.cpp
g++ -o the_executable neat.o nnode.o link.o trait.o gene.o network.o innovation.o organism.o species.o genome.o population.o formatting_SQ.o main.o -fopenmp -O3 -Wall -fPIC `python3 -m pybind11 --includes` -lpython3.6m
我的第一个问题来了:这些命令是正确的还是最终缺少编译标志?当我尝试执行 ./the_executable
.
然后,我尝试用所有其他构造函数文件独立编译 formatting_SQ.cpp
,但正如预期的那样,这不起作用,因为在 formatting_SQ.cpp
.[=29= 中没有对 main 的引用]
g++ -o temp_formatting neat.o nnode.o link.o trait.o gene.o network.o innovation.o organism.o species.o genome.o population.o formatting_SQ.o -fopenmp -O3 -Wall -fPIC `python3 -m pybind11 --includes` -lpython3.6m
所以我的第二个问题来了:我如何创建一个 python 嵌入式目标文件 linking formatting_SQ.cpp
与所有其他构造函数文件 没有 有这个 undefined reference to main
错误?
formatting_SQ.cpp
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <Python.h>
#include <omp.h>
#include "formatting_SQ.h"
#include "neat.h"
#include "network.h"
#include "link.h"
#include "nnode.h"
#include "trait.h"
#include "gene.h"
#include "genome.h"
#include "innovation.h"
#include "organism.h"
#include "species.h"
#include "population.h"
namespace py = pybind11;
py::module compile_data = py::module::import("initialize");
main.cpp
#include <pybind11/embed.h>
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <Python.h>
#include "formatting_SQ.h"
#include <omp.h>
namespace py = pybind11;
int main(int argc, char** argv){
....
因此,经过长时间的研究,我可以得出结论,编译方法是正确的,但要格外小心从 python 声明导入模块的位置,因为这对我来说是个问题
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <Python.h>
#include <omp.h>
#include "formatting_SQ.h"
#include "neat.h"
#include "network.h"
#include "link.h"
#include "nnode.h"
#include "trait.h"
#include "gene.h"
#include "genome.h"
#include "innovation.h"
#include "organism.h"
#include "species.h"
#include "population.h"
namespace py = pybind11;
py::module compile_data = py::module::import("initialize"); DON'T DO THIS its wrong !!!
您必须在本地声明您的模块,否则命名空间中会出现一些冲突,因为同一个模块可能会被多次导入,这会导致分段错误。