[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Building library for Windows


I know what’s wrong with this.  I’ve built the DLL (shared library).  When I explain, you should be able to build the static library.

[ 94%] Building C object examples/CMakeFiles/exec.dir/exec.c.obj
[ 95%] Building C object examples/CMakeFiles/exec.dir/authentication.c.obj
[ 97%] Building C object examples/CMakeFiles/exec.dir/knownhosts.c.obj
[ 98%] Building C object examples/CMakeFiles/exec.dir/connect_ssh.c.obj
[100%] Linking C executable exec.exe
[100%] Built target exec
573 -32- /home/rmills/gnu/libssh/libssh-0.7.3/build> find . -name "*.a" -exec ls -alt {} \;
-rw-r--r-- 1 rmills Administrators 11750 Sep 30 12:42 ./examples/CMakeFiles/exec.dir/objects.a
-rw-r--r-- 1 rmills Administrators 11012 Sep 30 12:42 ./examples/CMakeFiles/libsshpp.dir/objects.a
-rw-r--r-- 1 rmills Administrators 5990 Sep 30 12:42 ./examples/CMakeFiles/libsshpp_noexcept.dir/objects.a
-rw-r--r-- 1 rmills Administrators 11792 Sep 30 12:42 ./examples/CMakeFiles/senddata.dir/objects.a
-rw-r--r-- 1 rmills Administrators 651698 Sep 30 12:42 ./src/CMakeFiles/ssh_shared.dir/objects.a
-rw-r--r-- 1 rmills Administrators 241366 Sep 30 12:42 ./src/libssh.dll.a  <— GOOD
-rw-r--r-- 1 rmills Administrators 2122 Sep 30 12:42 ./src/threads/CMakeFiles/ssh_threads_shared.dir/objects.a
-rw-r--r-- 1 rmills Administrators 1538 Sep 30 12:42 ./src/threads/libssh_threads.dll.a  <— GOOD
574 -32- /home/rmills/gnu/libssh/libssh-0.7.3/build> find . -name "*.dll" -exec ls -alt {} \;
-rwxr-xr-x 1 rmills Administrators 2291514 Sep 30 12:42 ./src/libssh.dll <— GOOD
-rwxr-xr-x 1 rmills Administrators 41701 Sep 30 12:42 ./src/threads/libssh_threads.dll  <— GOOD

CMake is generating the following wrong response files:

575 -32- /home/rmills/gnu/libssh/libssh-0.7.3/build> find . -name "*.rsp" -exec ls -alt {} \;
-rw-r--r-- 1 rmills Administrators 425 Sep 30 12:41 ./examples/CMakeFiles/exec.dir/includes_C.rsp  <— WRONG
-rw-r--r-- 1 rmills Administrators 187 Sep 30 12:36 ./examples/CMakeFiles/exec.dir/linklibs.rsp
-rw-r--r-- 1 rmills Administrators 148 Sep 30 12:36 ./examples/CMakeFiles/exec.dir/objects1.rsp
-rw-r--r-- 1 rmills Administrators 264 Sep 30 12:36 ./examples/CMakeFiles/libsshpp.dir/includes_CXX.rsp  <— WRONG   
-rw-r--r-- 1 rmills Administrators 187 Sep 30 12:36 ./examples/CMakeFiles/libsshpp.dir/linklibs.rsp
-rw-r--r-- 1 rmills Administrators 42 Sep 30 12:36 ./examples/CMakeFiles/libsshpp.dir/objects1.rsp
-rw-r--r-- 1 rmills Administrators 264 Sep 30 12:36 ./examples/CMakeFiles/libsshpp_noexcept.dir/includes_CXX.rsp <— WRONG
-rw-r--r-- 1 rmills Administrators 187 Sep 30 12:36 ./examples/CMakeFiles/libsshpp_noexcept.dir/linklibs.rsp
-rw-r--r-- 1 rmills Administrators 60 Sep 30 12:36 ./examples/CMakeFiles/libsshpp_noexcept.dir/objects1.rsp
-rw-r--r-- 1 rmills Administrators 425 Sep 30 12:41 ./examples/CMakeFiles/senddata.dir/includes_C.rsp  <— WRONG
-rw-r--r-- 1 rmills Administrators 187 Sep 30 12:36 ./examples/CMakeFiles/senddata.dir/linklibs.rsp
-rw-r--r-- 1 rmills Administrators 168 Sep 30 12:36 ./examples/CMakeFiles/senddata.dir/objects1.rsp
-rw-r--r-- 1 rmills Administrators 425 Sep 30 12:41 ./src/CMakeFiles/ssh_shared.dir/includes_C.rsp  <— WRONG
-rw-r--r-- 1 rmills Administrators 166 Sep 30 12:36 ./src/CMakeFiles/ssh_shared.dir/linklibs.rsp
-rw-r--r-- 1 rmills Administrators 2137 Sep 30 12:36 ./src/CMakeFiles/ssh_shared.dir/objects1.rsp
-rw-r--r-- 1 rmills Administrators 425 Sep 30 12:40 ./src/threads/CMakeFiles/ssh_threads_shared.dir/includes_C.rsp  <— WRONG
-rw-r--r-- 1 rmills Administrators 182 Sep 30 12:36 ./src/threads/CMakeFiles/ssh_threads_shared.dir/linklibs.rsp
-rw-r--r-- 1 rmills Administrators 49 Sep 30 12:36 ./src/threads/CMakeFiles/ssh_threads_shared.dir/objects1.rsp
576 -32- /home/rmills/gnu/libssh/libssh-0.7.3/build>

The correct code (in each of the wrong files) on my system (to use the Qt 5.6 provided compiler is): 

-IC:/MinGW/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3/build/src/threads
-IC:/MinGW/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3/src/threads
-IC:/MinGW/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3/include
-IC:/MinGW/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3/build
-IC:/MinGW/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3
-IC:/Qt/Qt5.6.0/Tools/mingw492_32/i686-w64-mingw32/include
-IC:/MinGW/msys/1.0/local/include 

I had to generate the build files with this command:
cmake .. -G "Unix Makefiles" -DCMAKE_C_COMPILER=$(which gcc) -DCMAKE_CXX_COMPILER=$(which g++)

I had to build and install openssl with the commands (in the openssl delivery)
./config --prefix=/usr/local
make
make install

To build the static library, you’ll have to edit CMakeLists.txt.  You may well find that the linker response files are not correct for static libraries.

////////////  Here are notes I made along the way to solving this ////////////////////////

I tried to build libssh this morning on MinGW/64.  The experience was the same as MinGW/32.

1) I had to edit sdkddkver.h to build CMake

2) I had to bootstrap into —prefix=/usr/local (why is bootstrap not called configure?)

3) I had to use CMake with this command: cmake .. -G "Unix Makefiles" -DCMAKE_C_COMPILER=$(which gcc) -DCMAKE_CXX_COMPILER=$(which g++)

4) Here’s what happens when I run make
c:/MinGW64/msys/1.0/bin/cmake.exe -E cmake_progress_report C:/MinGW64/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3/build/CMakeFiles 12
[  1%] Building C object src/CMakeFiles/ssh_shared.dir/auth.c.obj
cd C:/MinGW64/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3/build/src && c:/TDM-GCC-64/bin/gcc.exe  -DLIBSSH_EXPORTS @CMakeFiles/ssh_shared.dir/includes_C.rsp   -o CMakeFiles/ssh_shared.dir/auth.c.obj   -c C:/MinGW64/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3/src/auth.c
In file included from c:/MinGW64/msys/1.0/include/sys/unistd.h:9:0,
                 from c:/MinGW64/msys/1.0/include/unistd.h:6,
                 from C:/MinGW64/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3/include/libssh/libssh.h:59,
                 from C:/MinGW64/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3/include/libssh/priv.h:138,
                 from C:/MinGW64/msys/1.0/home/rmills/gnu/libssh/libssh-0.7.3/src/auth.c:34:
c:/MinGW64/msys/1.0/include/sys/types.h:71:18: error: conflicting types for 'time_t'
 typedef _TIME_T_ time_t;

5) Exiv2 does not build with CMake either.  Dies a terrible death instantly down inside a stack of system include files involving pthread.

6) My notes about CMake are here:
svn://dev.exiv2.org/svn/trunk/contrib/buildserver/dailyCMake.sh <svn://dev.exiv2.org/svn/trunk/contrib/buildserver/dailyCMake.sh>

Some Exiv2 users love CMake.  I do not.  It works well on Linux/MacOS-X/Cygwin.  It doesn’t seem to work on MinGW.  It’s an obstructive monster with Visual Studio.  Of the 5 platforms we support on Exiv2, MinGW is the one I like least.  However we build and test Exiv2 on all 5 platform on every commit.  We build and test all 5 platforms and 6 editions of Visual Studio in 32 and 64 bits every night.

One of the challenges of using a build system such as CMake is to fix the build when CMake make mistakes.  Because there is an abstract layer (CMakeLists.txt) between the code and the compiler, when things go wrong you have to crawl through the generated magic.  This is not fun.  The Linux World’s attitude “It must be the fault of Windows, because it works on Linux” is very unhelpful.  You’re unlikely to get any sympathy on an opensource Forum.  It’s your lucky day to have met a helpful open-source contributor who is not Windows hostile.

I’m very pleased to have worked on this.   I still haven’t got Exiv2 to build using CMake on MinGW/32.  However, I’m confident that I’ll fix that over the weekend.

Robin 
http://clanmills.com <http://clanmills.com/>


Follow-Ups:
RE: Building library for WindowsServesh Singh <ssingh@xxxxxxxxxxxx>
References:
Building library for WindowsServesh Singh <ssingh@xxxxxxxxxxxx>
Re: Building library for WindowsRobin Mills <robin@xxxxxxxxxxxxx>
RE: Building library for WindowsServesh Singh <ssingh@xxxxxxxxxxxx>
Re: Building library for WindowsRobin Mills <robin@xxxxxxxxxxxxx>
RE: Building library for WindowsServesh Singh <ssingh@xxxxxxxxxxxx>
Archive administrator: postmaster@lists.cynapses.org