Skip to content
Back to formatted view

Raw Message

Message-ID: <06ea7d13-ab84-dc3b-2c5d-1acb574260b1@gmail.com>
Date: 2023-07-14T17:29:32Z
From: Russell Almond
Subject: [R-pkg-devel] Package Load fails to find 3rd Party DLL
In-Reply-To: <20230714181441.03c47c08@arachnoid>

Thanks.? I know know the problem is in the Makevars.win; however, I'm 
still confused.

My `Makevars.win` had

| .PHONY:?? all NeticaDLL clean

| all: $(SHLIB)
| $(SHLIB): NeticaDLL
|
| NeticaDLL:
|? ? mkdir -p "$(INSTALL_LIB)"
|? ? cp "${NETICA_LIB}/Netica.dll" "${INSTALL_LIB}"
|??? cp "${NETICA_LIB}/Netica.lib" "${INSTALL_LIB}"

[BTW, I tried change this to

| all: NeticaDLL $(SHLIB)

and got the same problem.]

This looks very much like the `mylibs` example in 
https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Using-Makevars

So I'm confused.? Why is the Makevars -> Makefile conversion assuming 
that all targets of $(SHLIB) (or all) are executable files, ignoring the 
PHONY declaration?

Also, does the example in the Writing R Extensions manual still work?

 ??? --Russell



On 7/14/23 11:14 AM, Ivan Krylov wrote:
> ? Wed, 12 Jul 2023 09:41:11 -0400
> Russell Almond<russell.g.almond at gmail.com>  ?????:
>
>>   ? C:\rtools43\x86_64-w64-mingw32.static.posix\bin\nm.exe:
>> 'NeticaDLL': No such file
> This is where the problem starts. You can retrace the steps that R
> takes when building and installing the package by running sh
> configure.win manually and then running something like
> R_PACKAGE_DIR="$(pwd)" R CMD SHLIB -n *.c in the src subdirectory of
> the package. That will in turn tell you the exact command lines to be
> run while building your package, including the following:
>
>   nm Cases.o Continuous.o Edges.o Experience.o Inference.o Networks.o \
>    Node.o Random.o Registration.o Session.o NeticaDLL \
>   | sed -n 's/^.* [BCDRT] / /p' \
>   | sed -e '/[.]refptr[.]/d' -e '/[.]weak[.]/d' \
>   | sed 's/[^ ][^ ]*/"&"/g' \
>   >> tmp.def;
>
> That "NeticaDLL" at the end of the list of object files doesn't belong
> there. I think it gets added because it's among the dependencies of the
> $(SHLIB) Make target. It would be best to make that target a real
> object file that nm.exe can process. Otherwise, you could also write
> your own .def file and skip its automatic generation.
>
> After nm fails, you get a crash in the linker (while parsing the
> resulting incomplete .def file?), which leaves your package without a
> shared library to use:
>
>> C:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: internal
>> error: aborting at ../../binutils-2.40/ld/ldlang.c:527 in
>> compare_section
>> C:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: please report
>> this bug
> There must be a way to streamline this process. Maybe put all the
> library-downloading and extraction code into a portable
> tools/configure.R (to be launched manually from the configure shell
> script), leaving src/Makevars only to compile your own code, link with
> Netica using PKG_LIBS, then copy the additional Netica DLL from a
> custom install.libs.R file?
>
-- 
Russell Almond
https://ralmond.net/

	[[alternative HTML version deleted]]