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
> > 
> > 
> 

Reply via email to