Thanks Jürgen. Now I have another problem.
The libAPL (libapl) html documentation first line states:
"libapl is a C library,…..” so in theory it should play nicely with Obj-C.
But this tiny test C program is causing me a linker problem that I do not 
understand

#include <stdio.h>
#include <dlfcn.h>
#include "/usr/local/include/apl/libapl.h"
int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    dlopen("/usr/local/lib/apl/libapl.so",RTLD_NOW|RTLD_GLOBAL);
    init_libapl("main", 0);
    return 0;
}

Undefined symbols for architecture x86_64:
  "_init_libapl", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

I typed this in Terminal
Gandalf:~ pteeson$ file /usr/local/lib/apl/libapl.so
/usr/local/lib/apl/libapl.so: Mach-O 64-bit bundle x86_64
Gandalf:~ pteeson$ nm /usr/local/lib/apl/libapl.so | grep init_libapl
00000000001975a0 T _init_libapl

respect….

Peter

> On May 20, 2018, at 9:40 AM, Juergen Sauermann 
> <[email protected]> wrote:
> 
> Hi Peter,
> 
> thanks, I have added  a typedef in libapl.h. SVN 1049.
> 
> /// Jürgen
> 
> 
> On 05/19/2018 09:53 PM, Peter Teeson wrote:
>> Thank you all for your replies. I removed the configure arg —with-android.
>> Now there is no error from dlopen() or dlclose() or dlsym() .
>> 
>> But we have a new problem… in this code libapl.h is missing a define for 
>> APL_Float.
>> 
>> #include "/usr/local/include/apl/libapl.h"
>> int main(int argc, const char * argv[]) {
>> 
>>     return 0;
>> }
>> 
>> However if I add the followed 2 lines (copied from lines 72-73 in 
>> APL_Types.hh) everything preprocesses just fine.
>> 
>> typedef double APL_Float_Base;
>> typedef APL_Float_Base APL_Float;
>> #include "/usr/local/include/apl/libapl.h"
>> 
>> int main(int argc, const char * argv[]) {
>> 
>>     return 0;
>> }
>> 
>> Looking at the source code in APL_Types.hh I notice 
>> 
>> line 39 #define APL_Float_is_class 0
>>      
>> and this in lines 62 -80
>> /// One (real) APL floating point value.
>> #if APL_Float_is_class // APL_Float is a class
>> 
>> #include "APL_Float_as_class.hh"
>> 
>> inline void release_APL_Float(APL_Float * x)   { x->~APL_Float(); }
>> 
>> #else   // APL_Float is a POD (double)
>> 
>> typedef double APL_Float_Base;
>> typedef APL_Float_Base APL_Float;
>> 
>> #define complex_exponent(x) exp(x)
>> #define complex_power(x, y) pow((x), (y))
>> #define complex_sqrt(x)     sqrt(x)
>> #define release_APL_Float(x)
>> 
>> #endif // APL_Float is class vs. POD
>> 
>> From this I conclude that somehow the typedefs weren’t included in the 
>> pre-processing/compiling of libapl
>> Not quite sure how to track this down any further.
>> 
>> respect
>> Peter
>> 
>>>  <[email protected] <mailto:[email protected]>> 
>>> wrote:
>> 
>>> 
>>> Hi,
>>> 
>>> Last time I had a similar problem I had to run
>>> autoconf/autoreconf/something like this to regenerate configure on OSX.
>>> 
>>> Elias Mårtenson <[email protected] <mailto:[email protected]>> writes:
>>> 
>>>> I don't think so. I believe the reason is that you're not compiling
>>>> with a flat namespace.
>>>> 
>>>> If I recall correctly OSX uses a different name resolution system
>>>> by default where symbols from one library doesn't automatically
>>>> become part of the namespace of another. 
>>>> 
>>>> There were some magic flags one can use with the linker to get
>>>> the normal behaviour from Linux, but I have no idea how it
>>>> works. I don't use OSX anymore so I can't really experiment with
>>>> it. 
>>>> 
>>>> Regards, 
>>>> Elias 
>>>> 
>>>> On Fri, 18 May 2018, 08:14 Peter Teeson,
>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>> 
>>>> I’ve been thinking about this and I believe it’s probably
>>>> because libapl.so is C++ but Cocoa is Obj-C.
>>>> Pure C plays nicely with Obj-C but there needs to be
>>>> wrappers for C++ to play nicely with Obj-C.
>>>> So while I wait for your wise replies I will research what to
>>>> do to use C++ dlls in Obj-C; I don’t even know if that is
>>>> possible.
>>>> 
>>>> respect….
>>>> 
>>>> Peter
>>>> 
>>>> On May 17, 2018, at 12:10 PM, Peter Teeson
>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>> 
>>>> Hi all:
>>>> The following is for svn 1048 ./configure —with-android
>>>> —with-libapl
>>>> Using MacOS Yosemite 10.10.5 and Xcode 6.4 and a
>>>> vanilla Cocoa Document app.
>>>> 
>>>> In the AppDelegate code I have the following:
>>>> 
>>>> void *libaplHandle; // plain C file pointer
>>>> 
>>>> - (void)applicationDidFinishLaunching:(NSNotification
>>>> *)aNotification {
>>>> // Load libapl from default location.
>>>> const char* libaplPath="/usr/local/lib/apl/libapl.so"; // TO
>>>> DO Make this path a User Preference....}
>>>> 
>>>> libaplHandle = dlopen(libaplPath,
>>>> RTLD_LAZY|RTLD_GLOBAL);
>>>> if (NULL == libaplHandle) {
>>>> char *error = dlerror();
>>>> printf("AppDelegate - dlopen(libaplHandle) error:
>>>> %s",error);
>>>> }
>>>> }
>>>> 
>>>> AppDelegate - dlopen(libaplHandle) error:
>>>> dlopen(/usr/local/lib/apl/libapl.so, 9): Symbol
>>>> not found: _CERR
>>>> Referenced from: /usr/local/lib/apl/libapl.so
>>>> Expected in: flat namespace
>>>> in /usr/local/lib/apl/libapl.so
>>>> 
>>>> I really have no idea why this happens. Please
>>>> educate me…..
>>>> 
>>>> Thanks and
>>>> 
>>>> respect…..
>>>> 
>>>> Peter
>>>> 
>>>> 
>>> 
>>> -- 
>>> Br,
>>> /Alexey
>> 
> 

Reply via email to