BTW: Some explanation of configure:
It attempts the following on linux:
>>>>>>
Source:
#include "confdefs.h"
#include "conffix.h"
/* Override any gcc2 internal prototype to avoid an error. */
char HYPRE_IJMatrixCreate();
static void _check_HYPRE_IJMatrixCreate() { HYPRE_IJMatrixCreate(); }
int main(void) {
_check_HYPRE_IJMatrixCreate();
return 0;
}
<<<<<<<
Note - it does not include 'HYPRE.h' here - but redefines the prototype as
'char HYPRE_IJMatrixCreate();
Compiling it manually:
>>>>
[balay@pj01 petsc]$ cat conftest.c
char HYPRE_IJMatrixCreate();
static void _check_HYPRE_IJMatrixCreate() { HYPRE_IJMatrixCreate(); }
int main(void) {
_check_HYPRE_IJMatrixCreate();
return 0;
}
[balay@pj01 petsc]$ gcc -c conftest.c
[balay@pj01 petsc]$ nm -Ao conftest.o |grep HYPRE_IJMatrixCreate
conftest.o:0000000000000000 t _check_HYPRE_IJMatrixCreate
conftest.o: U HYPRE_IJMatrixCreate
[balay@pj01 petsc]$ nm -Ao arch-linux-c-debug/lib/libHYPRE.so |grep
HYPRE_IJMatrixCreate
arch-linux-c-debug/lib/libHYPRE.so:000000000007f2c2 T HYPRE_IJMatrixCreate
[balay@pj01 petsc]$
<<<<
Here the "U HYPRE_IJMatrixCreate" in conftest.o matches "T
HYPRE_IJMatrixCreate" in libHYPRE.so - so the "link" test in configure succeeds!
>>>>>>
[balay@pj01 petsc]$ gcc -o conftest conftest.o
arch-linux-c-debug/lib/libHYPRE.so
[balay@pj01 petsc]$ echo $?
0
<<<<<
On windows - [due to name mangling by cdecl/stdcall, (/MT vs /MD) etc..] - this
might not match - resulting in link failures.
Satish
On Wed, 19 Jul 2023, Satish Balay via petsc-users wrote:
> You could try skipping this test [and assume --with-hypre-include and
> --with-hypre-lib options are correct] - and see if this works.
>
> diff --git a/config/BuildSystem/config/packages/hypre.py
> b/config/BuildSystem/config/packages/hypre.py
> index 5bc88322aa2..2d6c7932e17 100644
> --- a/config/BuildSystem/config/packages/hypre.py
> +++ b/config/BuildSystem/config/packages/hypre.py
> @@ -11,7 +11,7 @@ class Configure(config.package.GNUPackage):
> self.requiresversion = 1
> self.gitcommit = 'v'+self.version
> self.download =
> ['git://https://github.com/hypre-space/hypre','https://github.com/hypre-space/hypre/archive/'+self.gitcommit+'.tar.gz']
> - self.functions = ['HYPRE_IJMatrixCreate']
> + self.functions = []
> self.includes = ['HYPRE.h']
> self.liblist = [['libHYPRE.a']]
> self.buildLanguages = ['C','Cxx']
>
>
> Satish
>
>
> On Wed, 19 Jul 2023, Barry Smith wrote:
>
> >
> > You don't indicate what type of libraries you built hypre with; static or
> > shared. My guess is you ended up with shared
> >
> > I think the answer to your difficulty is hidden in __cdecl (Satish will
> > know much better than me). When you are looking for symbols in Windows
> > shared libraries you have to prepend something to the function prototype to
> > have it successfully found. For example the PETSc include files have these
> > things __declspec(dllimport) The configure test fails because it does not
> > provide the needed prototype. Likely you built PTScotch with static
> > libraries so no problem.
> >
> > The simplest fix would be to build static hypre libraries. I think it is
> > a major project to get PETSc configure and macro system to work properly
> > with external packages that are in Windows shared libraries since more use
> > of __declspec would be needed.
> >
> > Barry
> >
> > The PETSc installation instructions should probably say something about
> > external packages with Windows shared libraries.
> >
> >
> >
> >
> >
> >
> >
> > > On Jul 19, 2023, at 10:52 AM, Daniel Stone <[email protected]>
> > > wrote:
> > >
> > > Hello,
> > >
> > > I'm working on getting a petsc build running on windows. One necessary
> > > package to include is Hypre. I've been able to build Hypre seperately
> > > using cmake, and confirmed that the library works
> > > by setting up a VS project to run some of the example programs.
> > >
> > > My attempted petsc build is being done through cygwin. I've been able to
> > > (with varying degrees of difficulty), build a fairly plain petsc, and one
> > > that downloads and builds ptscotch (after some modifications
> > > to both ptscotch and the config script). I am now attempting to include
> > > Hypre (using the --hypre-iclude and --hypre-lib flags, etc). Note that
> > > the same compilers are being used for both Hypre and for petsc
> > > through cygwin - the new intel oneapi compilers (icx and ifx, after again
> > > varying amounts of pain to work around their awkwardness with the config
> > > script).
> > >
> > > I'm seeing a problem when the config script does some tests on the
> > > included hypre lib. The source code looks like:
> > >
> > > #include "confdefs.h"
> > > #include "conffix.h"
> > > /* Override any gcc2 internal prototype to avoid an error. */
> > >
> > > #include "HYPRE.h"
> > >
> > > char HYPRE_IJMatrixCreate();
> > > static void _check_HYPRE_IJMatrixCreate() { HYPRE_IJMatrixCreate(); }
> > >
> > > int main() {
> > > _check_HYPRE_IJMatrixCreate();;
> > > return 0;
> > > }
> > >
> > >
> > > As I understand this is a fairly standard type of stub program used by
> > > the config script to check that it is able to link to certain symbols in
> > > given libraries. Tests like this have succeeded in my builds that
> > > include PTScotch.
> > >
> > > I keep getting a linker error with the above test, including if I
> > > seperate it out and try to build it seperately:
> > >
> > > unresolved external symbol "char __cdel HYPRE_IJMatrixCreate(void)" ....
> > >
> > > Ok, it looks like a problem with either the library or linker commands.
> > > But here's the interesting thing - If I transplant this code into VS,
> > > with the same project setting that allows it to build the much more
> > > nontrivial Hypre example programs, I get the same error:
> > >
> > > Error LNK2001 unresolved external symbol "char __cdecl
> > > HYPRE_IJMatrixCreate(void)" (?HYPRE_IJMatrixCreate@@YADXZ) hypretry1
> > > C:\Users\DanielOGS\source\repos\hypretry1\hypretry1\Source.obj 1
> > >
> > > So it seems like there might be something about this type of stub program
> > > that is not working with my Hypre library. I don't fully understand this
> > > program - it's able to call the function with no arguments, but
> > > it also needs to be linked against a library containing the function,
> > > apparently by wrapping it in a static void function? Not something I've
> > > seen before.
> > >
> > > Does anyone have any insight into what might be going wrong - or really
> > > just any explaination of how the stub program works so I can figure out
> > > why it isn't in this case?
> > >
> > > Many thanks,
> > >
> > > Daniel
> >
> >
>