IPNL-POLYU / pyrtklib

Unleash all the performance of the most popular GNSS library -- RTKLIB in python. A python binding for RTKLIB provides full functions
https://www.polyu.edu.hk/aae/ipn-lab/us/index.html
MIT License
57 stars 8 forks source link

what should be done to bind functions that are not in rtklib.h? #4

Closed zvictorliu closed 3 months ago

zvictorliu commented 3 months ago

fucnctions like rescode, valsol are not declared in rtklib.h

Now I am trying to bind them, however it seems a linker problem occurred:

ImportError: /home/<user>/miniconda3/envs/py39/lib/python3.9/site-packages/pyrtklib-0.2.5-py3.9-linux-x86_64.egg/pyrtklib/pyrtklib.so: undefined symbol: _Z7rescodeiPK6obsd_tiPKdS3_S3_PKiPK5nav_tS3_PK8prcopt_tPdSC_SC_SC_PiSC_SD_

I have those modification:

in pyrtklib.cpp:

m.def("rescode", static_cast<int (*)(int iter, const obsd_t *obs, int n, Arr1D<double> Srs,
                   Arr1D<double> Sdts, Arr1D<double> Svare, Arr1D<int> Ssvh,
                   const nav_t *nav, Arr1D<double> Sx, const prcopt_t *opt,
                   Arr1D<double> Sv, Arr1D<double> SH, Arr1D<double> Svar, Arr1D<double> Sazel, Arr1D<int> Svsat,
                   Arr1D<double> Sresp, int *ns)>(&rescode), "rtklib rescode");

extern int rescode(int iter, const obsd_t *obs, int n, Arr1D<double> Srs,
                   Arr1D<double> Sdts, Arr1D<double> Svare, Arr1D<int> Ssvh,
                   const nav_t *nav, Arr1D<double> Sx, const prcopt_t *opt,
                   Arr1D<double> Sv, Arr1D<double> SH, Arr1D<double> Svar, Arr1D<double> Sazel, Arr1D<int> Svsat,
                   Arr1D<double> Sresp, int *ns)
{
    const double *rs = Srs.src;
    const double *dts = Sdts.src;
    const double *vare = Svare.src;
    const int *svh = Ssvh.src;
    const double *x = Sx.src;
    double *v = Sv.src;
    double *H = SH.src;
    double *var = Svar.src;
    double *azel = Sazel.src;
    int *vsat = Svsat.src;
    double *resp = Sresp.src;
    auto tmp = rescode(iter, obs, n, rs, dts, vare, svh, nav, x, opt, v, H, var, azel, vsat, resp, ns);
    return tmp;
}

in rtklib.h

EXPORT int rescode(int iter, const obsd_t *obs, int n, const double *rs,
                   const double *dts, const double *vare, const int *svh,
                   const nav_t *nav, const double *x, const prcopt_t *opt,
                   double *v, double *H, double *var, double *azel, int *vsat,
                   double *resp, int *ns);

in pntpos.c

static -> extern

ebhrz commented 3 months ago

Hi, sorry for the late reply. I copied your code, but it seems work well. image

Theoretically, if there's something wrong with the linking process, the compile should not pass, unless you use the dynamic library mode. So, do you switch on the LIBRARY option in CMakeLists.txt? Could you provide more details?

zvictorliu commented 3 months ago

Thanks! I don't exactly know the reason but now it seems work well after re-buiding.

Anyway, thanks for your reply

ebhrz commented 3 months ago

Good job. If you have any more questions, feel free to contact me.