Vincular archivos de objetos de C ++ incrustados con Python
Tengo un archivo constructor de C ++ ( formatting_SQ.cpp) de un archivo de encabezado formatting_SQ.hque quiero vincular a otros archivos de constructor de archivos de encabezado ( neat.cpp nnode.cpp link.cpp etc...-> neat.h nnode.h link.h) para tener formatting_SQ.o.
Luego, quiero vincular mi archivo main.cpp con este formatting_SQ.oarchivo. El problema es: formatting_SQestá incrustado con Python, y hasta donde yo entiendo, C ++ incrustado con Python necesita el indicador de compilación -lpython3.6men Linux: dicho indicador requiere una referencia a una main()función, que no tengo formatting_SQ.cppporque es un archivo de constructor para ser un archivo de objeto.
Así que primero intenté crear archivos de objeto para cada archivo de constructor y luego vincular todo a la vez :
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
Aquí viene mi primera pregunta: ¿Son correctos estos comandos o finalmente falta un indicador de compilación? Esto me da una falla de segmentación mientras intento ejecutar ./the_executable.
Luego, intenté compilar de forma formatting_SQ.cppindependiente con todos los demás archivos constructores, pero como se esperaba, esto no funciona porque no hay ninguna referencia a main in formatting_SQ.cpp.
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
Entonces, aquí viene mi segunda pregunta: ¿cómo podría crear un archivo de objeto incrustado de Python que se vincule formatting_SQ.cppcon todos los demás archivos del constructor sin tener este undefined reference to mainerror?
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){
....
Respuestas
Entonces, después de algunas largas horas de investigación, puedo concluir que el método de compilación es correcto, pero TENGA EXTREMADAMENTE CUIDADO con dónde declara sus módulos de importación desde Python, porque este fue el problema para mí.
#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 !!!
Debe declarar sus módulos localmente, de lo contrario, habrá algunos conflictos en el espacio de nombres, ya que el mismo módulo se puede importar más de una vez y esto causa la falla de segmentación.