yeah I apologise for the wrong example , LibC utilises the enviroment/system variables.
Generally speaking all OSes have a PATH variable that defines the places where common libraries and tools are to be found. If you are on windows you can type in the command prompt , "PATH", in Linux and MacOS is "$PATH" . You can add your path in Windows using the system variables dialog window, in MacOS and Linux it usually happens via .bash-config file that setups the path but I am not so sure. The easiest way is to do something like macModuleName does in the LGitLibrary class the code is macModuleName | pluginDir | pluginDir := Smalltalk vm binary parent / 'Plugins'. #('libgit2.dylib' 'libgit2.0.dylib') detect: [ :each | (pluginDir / each) exists ] ifFound: [ :libName | ^ libName ]. self error: 'Module not found.' Hope that helps On Wed, Oct 17, 2018 at 12:54 PM Michel Onoff <michel.on...@web.de> wrote: > Hi Dimitris, > > thanks for the long explanation. > > As you can see from my example, I build the library with the > -undefined dynamic_lookup > flag to clang, so this should be compatible with your (3) option if I > understand you correctly. Compiling/linking this way should allow the > use of dlopen(3) from UFFI during the execution of Pharo code, exactly > as I try to simulate with my small test programs. > > Pharo complains about not being able to load the module (the library), > even if it appears in the Pharo main folder. It does not report whether > it cannot find it or if it cannot bind it using dlopen(3). > > Moreover, it is unclear to me how Pharo interacts with DYLD_LIBRARY_PATH > (on macOS) or LD_LIBRARY_PATH (on Linux) environment variables if they > are set. > > In other words, Where does it search for libraries? > > > > Anyway, I'll try your script on cmake. > > > Regards > MO > > > > > for use with dlopen() > > On 2018-10-17 11:32, Dimitris Chloupis wrote: > > I advice first of all the use of CMake , you can thank me later. > > > > CMake if you are not aware is the standard build system for C/C++ , it > > makes it super easy to build and compile projects so you dont have to do > > what you are doing, call the compiler and pass the inifite amount of > > compiler flags that it needs. > > > > To understand how to build a library you have to understand first what a > > library is. > > > > Libraries used by Pharo are known as either Shared Libraries on Macos > > (dylib) and Linux (so) but Dynamically Linked Libraries on Windows > > (DLLs). They are executables designed to be called from another > > executable (this includes another library as well). > > > > Those libraries operate in 3 modes > > 1) Static linking > > 2) semi dynamic linking > > 3) dynamic linking > > > > (1) may come as suprise but yes those libraries can be linked to the > > executable and build inside the exrecutable. But in our case we done > > want that because it would mean to rebuild the VM. > > (2) is not what we want either because eventhough it builds the library > > independently generating the usual exetension files I mentioned above it > > includes its symbole table in the executable so you wont have to do what > > UFFI does, wrap or map your code to those library functions. The > > equivelant for Pharo would mean that we would not need UFFI at all but > > we do need to rebuld the VM to include ths symbol table. The symbole > > table basically includes the name of the functions, their signatures > > (type of arguments) and their corresponing adresses in memory needed to > > access them. > > > > (3) is what UFFI does, in that cause the executable is not affected at > > all so you dont need to to rebuild the vm. But you do need to know where > > to find the library , to access its symbol table and make sure the > > variables your executable uses match the type and signature in the > > symbol table or else the executable wont able to locate and correctly > > call these functions. Of course libraries can contain structs and global > > variables as well but the concept is the same. Now this messy part is > > handled by the UFFI although barely because it still needs from you to > > provide the correct signature to the function. > > > > I am giving you the long version because you have to make sure you build > > you library with (3) way and not (2). (1) can be easily avoid but it is > > easy to mix (2) and (3). From there on its easy , locating the library > > is provided as a string returned by a method , see how UFFI utilises > > LibC for example and from there on you just convert the signatures to > > symbol arrays as described by the UFFI tutorials. > > > > For cmake you only need to use -> add_library(libraryname MODULE ${SRC} > > ). You can find a CmakeList.txt file that I use here > > https://gist.github.com/kilon/ff4b973bdeb3b0c0253ac373a4b2506a > > > > If you are wondering why its so big, its because the project I link > > against is huge and because I move the DLL to its build folder instead > > of building it in the same folder as my source code. It CMake's why of > > keeping things seperate and organised. Observe also that I use dll > > exension for Windows and MacOS, The extensions plays no role so I > > decided to go for the same extension to save time although usually its > > preferable go for the standard extensions. > > > > Beware that if your library uses any external code even parts of the C > > standard library those will have to be included , usually you need only > > the header files, which is what SET INC is doing in my example, while > > SET SRC includes only the library files. The inclusion of headers is > > super important because they are used to build the symbol table which is > > the most important part of the library. Without a correctly build symbol > > table the library is useless even when used from C/C++. > > > > On Wed, Oct 17, 2018 at 11:09 AM Michel Onoff <michel.on...@web.de > > <mailto:michel.on...@web.de>> wrote: > > > > Hello, > > > > I've made some attempts to use the Pharo FFI. I've gone through the > > documentation [1] and tried some examples. > > > > While the documentation is quite clear about using external libraries > > from Pharo, it lacks details on how to build own libraries to be used > > from Pharo. > > > > Specifically, I'm trying to build on all supported platforms, namely > > macOS, Windows and Linux. Currently I've got Linux and Windows under > > control, but I cannot find a systematic way to build on macOS. > > > > Here's an example for a library that I can use from a small test > > program > > but not from Pharo. Unfortunately, the diagnostic on Pharo is not > > detailed: it simply reports that it cannot load the module. > > > > > > clang -I <include-path> -O3 -c <source-path> > > ... > > clang -dynamiclib <object-files> -o lib<name>.dylib -undefined > > dynamic_lookup > > > > cp lib<name>.dylib <pharo-folder> > > > > > > Is there good documentation about how to correctly build libraries so > > that they can be used from Pharo? > > > > Alternatively, are there details on how Pharo FFI searches for > > libraries > > and links them in the Pharo process? > > > > > > Regards > > MO > > > > ---- > > > > [1] https://files.pharo.org/books-pdfs/booklet-uFFI/UFFIDRAFT.pdf > > > > > > >