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 <daniel.st...@opengosim.com> 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