Menautkan file objek C ++ yang disematkan dengan Python
Saya memiliki file konstruktor C ++ ( formatting_SQ.cpp) dari file header formatting_SQ.hyang ingin saya tautkan ke file konstruktor lain dari file header ( neat.cpp nnode.cpp link.cpp etc...-> neat.h nnode.h link.h) agar memilikinya formatting_SQ.o.
Kemudian, saya ingin menautkan file main.cpp saya dengan formatting_SQ.ofile ini . Masalahnya adalah: formatting_SQdisematkan dengan python, dan sejauh pemahaman saya, C ++ yang disematkan dengan Python membutuhkan bendera kompilasi -lpython3.6mdi Linux: bendera semacam itu memerlukan referensi ke suatu main()fungsi, yang tidak saya miliki formatting_SQ.cppkarena itu adalah file konstruktor yang dimaksudkan menjadi file objek.
Jadi saya pertama kali mencoba membuat file objek untuk setiap file konstruktor dan kemudian menautkan semuanya sekaligus :
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
Inilah pertanyaan pertama saya: Apakah perintah ini benar atau apakah pada akhirnya ada tanda kompilasi yang hilang? Ini memberi saya kesalahan segmentasi saat saya mencoba mengeksekusi ./the_executable.
Kemudian, saya mencoba mengompilasi formatting_SQ.cppsecara independen dengan semua file konstruktor lainnya, tetapi seperti yang diharapkan, ini tidak berfungsi karena tidak ada referensi ke 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
Jadi, inilah pertanyaan kedua saya: bagaimana saya bisa membuat file objek tertanam python yang terhubung formatting_SQ.cppdengan semua file konstruktor lainnya tanpa mengalami undefined reference to mainkesalahan ini ?
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){
....
Jawaban
Jadi setelah beberapa jam penelitian yang panjang saya dapat menyimpulkan bahwa metode kompilasi benar tetapi SANGAT HATI-HATI dengan di mana Anda mendeklarasikan modul impor Anda dari python, karena ini adalah masalah bagi saya.
#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 !!!
Anda harus mendeklarasikan modul Anda secara lokal jika tidak, ada beberapa konflik di namespace karena modul yang sama mungkin diimpor lebih dari sekali dan ini menyebabkan kesalahan segmentasi.