Hello,

First message for this mailist, many thanks for your help and time guys.

I am trying to crosscompile an statically version of libcurl which can
be use by mingw to create a DLL usable by rundll32 on a Windows
system.
I am trying this from an Ubuntu 18.04.4 LTS with the current git
version of libcurl which is 7.70.1-DEV and I am executing the library
with: rundll32.exe "<PathToDLL>",AltEntry
I also verified that the exported function is present through a small
windows tool called dllexp.exe.

Unfortunately, when including the libcurl.a library in the compilation
process, the library stops being loaded by rundll32.
After having a look with a debugger, I realized that the DLL its
unloaded after tried to be loaded. Last DLL which tries to load is
ws2_32.dll but at this point I am not really sure if it just something
problematic with it in my compilation process or it is just the last
dependency libcurl is trying to load.

This is the error I receive.
---------------------------
RunDLL
---------------------------
There was a problem starting libtest.dll
The specified module could not be found.
---------------------------
OK
---------------------------

Which makes sense since it's been unloaded from memory. But why?

I tried tons of different configurations but for the sake of
simplicity I configured a separately project and used the following:
./configure                   \
  --prefix=`pwd`/build        \
  --host=x86_64-w64-mingw32   \
  --disable-shared            \
  --disable-ldap              \
  --disable-ldaps

make -j`nproc`
make install

------------------- CMakeLists.txt -------------------
cmake_minimum_required(VERSION 3.16)
project(test C)

set(CMAKE_C_STANDARD 99)
set(CMAKE_VERBOSE_MAKEFILE on)

include_directories(extra/curl/include)
link_directories(extra/curl/lib)

add_definitions(-DCURL_STATICLIB -DWINDOWS)
add_library(
    test SHARED
    library.c library.h
)

target_compile_options(test PRIVATE -Wall)
target_link_libraries(test curl pthread ws2_32)

--------------- mingw-w64-x86_64.cmake ---------------
set(CMAKE_SYSTEM_NAME Windows)
set(TOOLCHAIN_PREFIX x86_64-w64-mingw32)

set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_Fortran_COMPILER ${TOOLCHAIN_PREFIX}-gfortran)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)

set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "")
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll" ".dll.a" ".lib" ".a")

------------------------------------------------------

The source code is just a DLLMain entry point + DLLExport function
which call MessageBox an curl_easy_init() to verify everything worked
and that I can build above it. I don't think it would be necessary but
I could include those source files too.

My IDE is CLion and I am compiling the project by specifying in the
cmake section of the project settings
-DCMAKE_TOOLCHAIN_FILE=./mingw-w64-x86_64.cmake.
Since the CMakeLists.txt is set to verbose I can see a lot of output
staying that everything is correct. I guess the most valuable string
is the following mingw32 compilation command.
/usr/bin/x86_64-w64-mingw32-gcc -DCURL_STATICLIB -DWINDOWS
-Dtest_EXPORTS @CMakeFiles/test.dir/includes_C.rsp -g   -Wall
-std=gnu99 -o CMakeFiles/test.dir/library.c.obj   -c
/home/diego/CLionProjects/test/library.c

I also checked the options used by the compilation process via
curl-config and they seem fine to me.
$ ./curl-config --built-shared --cc --cflags --features --static-libs
no
x86_64-w64-mingw32-gcc
-DCURL_STATICLIB -I/[snipped]/curl/build/include
IPv6
AsynchDNS
/[snipped]/curl/build/lib/libcurl.a -lws2_32

------------------------------------------------------

Could you please point me what I am doing wrong here? Probably is
something I messed up since I am not used to cross compilations
processes.


Many thanks for your help,
Cheers
-------------------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library
Etiquette:   https://curl.haxx.se/mail/etiquette.html

Reply via email to