Re: error loading cxx local model in isis: undefined symbol

From: Thomas Dauser <thomas.dauser_at_email.domain.hidden>
Date: Thu, 14 Nov 2013 22:08:13 -0500
Hi again,

sorry for a further mail. I didn't really check the code I copied in the 
email. Clearly it should mean:

#include <stdio.h>
#include <xsTypes.h>

extern "C" void test(const Real* energy, int Nflux, const Real* 
parameter, int spectrum, Real* flux, Real* fluxError, const char* init)
{
  int i;
  for (i = 0; i < Nflux; i++) flux[i] = 1.0;	
}

Cheers,
Thomas


On 11/14/2013 09:00 PM, Thomas Dauser wrote:
> Hi Maurice,
>
> I tried to get it working with your wrapper. However, I got the same
> error again. Then I tried with simply this function below (without the
> C++ RealArray&):
>
> #include <stdio.h>
> #include <xsTypes.h>
>
> extern "C" void test(const Real* energy, int Nflux, const Real*
> parameter, int spectrum, Real* flux, Real* fluxError, const char* init)
> {
>   flux[Nflux] = {1.};
> }
>
> The lmodel.dat file also is also really normal.
>
> fun       1  0.         1.e20            c_test  add  0
> dummy   " "    3.    -10.    -10.    10.       10.       -0.1
>
> What am I missing here? (By the way: I already included the 'extern "C"'
> in the first model)
>
> Cheers,
> Thomas
>
>
> On 11/14/2013 04:25 PM, Maurice Leutenegger wrote:
>> Hi Thomas,
>>
>> here is the code. You can invoke the wrapper function like this:
>>
>> #include "isisCPPFunctionWrapper.h"
>>
>> static const size_t MYXSPECMODEL_N_PARAMETERS (anIntegerConstant); //
>> This is the number of parameters in your model as specified in lmodel.dat
>>
>> void myXSPECmodel
>> (const RealArray& energy, const RealArray& parameter, int spectrum,
>>   RealArray& flux, RealArray& fluxError, const string& init)
>> {
>>   ...
>> }
>>
>> void myXSPECmodel_isis
>> (const Real* energy, int Nflux, const Real* parameter, int spectrum,
>>   Real* flux, Real* fluxError, const char* init)
>> {
>>    isisCPPFunctionWrapper (energy, Nflux, parameter, spectrum, flux,
>> fluxError,
>>                init, MYXSPECMODEL_N_PARAMETERS, &myXSPECmodel);
>>    return;
>> }
>>
>> Cheers,
>>
>> Maurice
>>
>> On 11/14/13 4:12 PM, Thomas Dauser wrote:
>>> Hi Maurice,
>>>
>>> yes, what you describe is exactly my problem. It would be great if you
>>> could send me your source code of the wrapper.
>>>
>>> Thanks!
>>>
>>> Cheers,
>>> Thomas
>>>
>>> On 11/14/2013 04:03 PM, Maurice Leutenegger wrote:
>>>> Hi Thomas,
>>>>
>>>> if you have declared your XSPEC local model function prototypes as "C++
>>>> style", i.e. using RealArray&s instead of Real*s, then you won't be
>>>> able
>>>> to use them even if the "extern C" linkage problem is fixed, since the
>>>> function explicitly includes C++ objects in the interface to isis. I
>>>> solved this problem by writing a wrapper function and then using the
>>>> wrapper to create an isis alias function for each of my local models,
>>>> e.g. myLocalModel (C++ inputs)-> myLocalModel_isis (C inputs). If this
>>>> is useful to you, let me know and I will send you the source code for
>>>> the wrapper.
>>>>
>>>> Cheers,
>>>>
>>>> Maurice
>>>>
>>>>
>>>> On 11/14/13 3:45 PM, John Houck wrote:
>>>>> On Wed, Nov 13, 2013 at 15:07 -0500, Thomas Dauser wrote:
>>>>>> Dear isis-users,
>>>>>>
>>>>>> did anyone experience problems including a cxx local model in isis?
>>>>>>
>>>>>> Here is my problem: I compile it once with xspec:
>>>>>>
>>>>>> initpackage fun_test lmodel.dat .
>>>>>>
>>>>>> While I can load (and evaluate) it in xspec without errors:
>>>>>>
>>>>>> XSPEC12>lmod fun_test .
>>>>>> Model package fun_test successfully loaded.
>>>>>>
>>>>>> however, for the same model library (without any recompiling), isis
>>>>>> complains with
>>>>>>
>>>>>> isis> load_xspec_local_models (".");
>>>>>> Loading ././libfun_test.so
>>>>>> Error loading symbol C_test for model fun
>>>>>> Link error: ././libfun_test.so: undefined symbol: C_test
>>>>>>
>>>>>> And isis is somehow right, as C_test is not defined ("nm -D
>>>>>> libfun_test.so | grep C_test" does not give a result).
>>>>> Since isis is (usually compiled as) a C program and not a C++
>>>>> program, your model must export a "C" linkage symbol for isis
>>>>> to link to.
>>>>>
>>>>> What output does this produce?:
>>>>>     nm libfun_test.so
>>>>>
>>>>> The C++ symbols are usually "mangled" containing embedded
>>>>> interface that describes the subroutine interface.
>>>>> Probably your library contains only a C++ interface.
>>>>>
>>>>> To provide a C-linkage symbol, your C++ interface must
>>>>> provide an interface declared as extern "C" (and that also
>>>>> follows the Xspec interface naming conventions).
>>>>>
>>>>> Thanks,
>>>>> -John
>>>>>
>>>>>> What am I missing here? Is there a difference, how I need to treat
>>>>>> xspec and isis local models? I know that the "C_" has to be included
>>>>>> in the lmodel.dat file to tell xspec/isis that this is C/C++ code
>>>>>> and not fortran.
>>>>>>
>>>>>> I have the latest isis version 1.6.2-27 and heasoft 6.14 installed.
>>>>>>
>>>>>> Thanks for your help.
>>>>>>
>>>>>> Cheers,
>>>>>> Thomas
>>>>>>
>>>>>> ----
>>>>>> You received this message because you are
>>>>>> subscribed to the isis-users list.
>>>>>> To unsubscribe, send a message to
>>>>>> isis-users-request_at_email.domain.hidden>>>>>> with the first line of the message as:
>>>>>> unsubscribe
>>>>> ----
>>>>> You received this message because you are
>>>>> subscribed to the isis-users list.
>>>>> To unsubscribe, send a message to
>>>>> isis-users-request_at_email.domain.hidden>>>>> with the first line of the message as:
>>>>> unsubscribe
>>>>>
>>>>
>>>> ----
>>>> You received this message because you are
>>>> subscribed to the isis-users list.
>>>> To unsubscribe, send a message to
>>>> isis-users-request_at_email.domain.hidden>>>> with the first line of the message as:
>>>> unsubscribe
>>>>
>>
> ----
> You received this message because you are
> subscribed to the isis-users list.
> To unsubscribe, send a message to
> isis-users-request_at_email.domain.hidden> with the first line of the message as:
> unsubscribe
>
----
You received this message because you are
subscribed to the isis-users list.
To unsubscribe, send a message to
isis-users-request_at_email.domain.hiddenwith the first line of the message as:
unsubscribe
Received on Thu Nov 14 2013 - 22:08:42 EST

This archive was generated by hypermail 2.3.0 : Fri May 02 2014 - 08:35:47 EDT