Collegamento di file oggetto C ++ incorporati con Python

Oct 03 2020

Ho un file di costruzione C ++ ( formatting_SQ.cpp) di un file di intestazione formatting_SQ.hche voglio collegare ad altri file di costruzione di file di intestazione ( neat.cpp nnode.cpp link.cpp etc...-> neat.h nnode.h link.h) per avere formatting_SQ.o.

Quindi, voglio collegare il mio file main.cpp a questo formatting_SQ.ofile. Il problema è: formatting_SQè incorporato con python e, per quanto ne so, C ++ incorporato con Python ha bisogno del flag di compilazione -lpython3.6msu Linux: tale flag richiede un riferimento a una main()funzione, che non ho formatting_SQ.cppperché è un file costruttore inteso essere un file oggetto.

Quindi ho prima provato a creare file oggetto per ogni file del costruttore e quindi collegare tutto insieme contemporaneamente :

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

Ecco la mia prima domanda: questi comandi sono corretti o alla fine manca un flag di compilazione? Questo mi dà un errore di segmentazione mentre cerco di eseguire ./the_executable.

Quindi, ho provato a compilare in modo formatting_SQ.cppindipendente con tutti gli altri file del costruttore, ma come previsto, questo non funziona perché non vi è alcun riferimento 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

Quindi ecco la mia seconda domanda: come posso creare un file oggetto incorporato in Python che si collega formatting_SQ.cppcon tutti gli altri file del costruttore senza avere questo undefined reference to mainerrore?

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){
      
....

Risposte

Joachim Oct 03 2020 at 12:19

Quindi dopo alcune lunghe ore di ricerca posso concludere che il metodo di compilazione è corretto ma STA ESTREMAMENTE ATTENZIONE a dove dichiari i tuoi moduli di importazione da python, perché questo era il problema per me

#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 !!! 

Devi dichiarare i tuoi moduli localmente altrimenti potrebbero esserci dei conflitti nello spazio dei nomi poiché lo stesso modulo potrebbe essere importato più di una volta e questo causa l'errore di segmentazione.