cmakecross-compilinglibstdc++mingw-w64

cmake unable to find libstdc++


(Using elementaryOS/Ubuntu)

I'm cross-compiling x265 and I encouraged annoying problem. For some reason cmake doesn't want to accept -static-libstdc++, because ld is apparently unable to find it. Cmake is built from Source Code, working pretty well without -static-libstdc++, if I then copy libstdc++-6.dll from mingw-w64 libs to folder with x265.exe, it works well, but I want it to build with it. mingw was built with this script and contains these libraries, but I don't know where is ld looking for them.

Here is output of cmake attempt:

-- cmake version 3.5.0-rc1
-- The C compiler identification is GNU 5.2.0
-- The CXX compiler identification is GNU 5.2.0
-- Check for working C compiler: /home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-gcc
-- Check for working C compiler: /home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-g++
-- Check for working CXX compiler: /home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-g++ -- broken
CMake Error at /usr/local/share/cmake-3.5/Modules/CMakeTestCXXCompiler.cmake:54 (message):
  The C++ compiler
  "/home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-g++" is not
  able to compile a simple test program.

  It fails with the following output:

   Change Dir: /home/myname/x265/build/linux/12bit/CMakeFiles/CMakeTmp



  Run Build Command:"/usr/bin/make" "cmTC_e7611/fast"

  /usr/bin/make -f CMakeFiles/cmTC_e7611.dir/build.make
  CMakeFiles/cmTC_e7611.dir/build

  make[1]: Entering directory
  `/home/myname/x265/build/linux/12bit/CMakeFiles/CMakeTmp'

  Building CXX object CMakeFiles/cmTC_e7611.dir/testCXXCompiler.cxx.obj

  /home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-g++
  -static-libgcc -static-libstdc++ -o
  CMakeFiles/cmTC_e7611.dir/testCXXCompiler.cxx.obj -c
  /home/myname/x265/build/linux/12bit/CMakeFiles/CMakeTmp/testCXXCompiler.cxx

  Linking CXX executable cmTC_e7611.exe

  /usr/local/bin/cmake -E cmake_link_script
  CMakeFiles/cmTC_e7611.dir/link.txt --verbose=1

  /usr/local/bin/cmake -E remove -f CMakeFiles/cmTC_e7611.dir/objects.a

  /home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-ar cr
  CMakeFiles/cmTC_e7611.dir/objects.a @CMakeFiles/cmTC_e7611.dir/objects1.rsp

  /home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-g++
  -static-libgcc -static-libstdc++ -Wl,--whole-archive
  CMakeFiles/cmTC_e7611.dir/objects.a -Wl,--no-whole-archive -o
  cmTC_e7611.exe -Wl,--out-implib,libcmTC_e7611.dll.a
  -Wl,--major-image-version,0,--minor-image-version,0
  @CMakeFiles/cmTC_e7611.dir/linklibs.rsp


  /home/myname/mingw-w64/mingw-w64-x86_64/lib/gcc/x86_64-w64-mingw32/5.2.0/../../../../x86_64-w64-mingw32/bin/ld:
  cannot find -lstdc++

  collect2: error: ld returned 1 exit status

  make[1]: *** [cmTC_e7611.exe] Error 1

  make[1]: Leaving directory
  `/home/myname/x265/build/linux/12bit/CMakeFiles/CMakeTmp'

  make: *** [cmTC_e7611/fast] Error 2





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:19 (project)


-- Configuring incomplete, errors occurred!
See also "/home/myname/x265/build/linux/12bit/CMakeFiles/CMakeOutput.log".
See also "/home/myname/x265/build/linux/12bit/CMakeFiles/CMakeError.log".
make: *** No targets specified and no makefile found.  Stop.

Cmake is run like code below.

cmake -DCMAKE_C_COMPILER='/home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-gcc' -DCMAKE_CXX_COMPILER='/home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-g++' -DCMAKE_RC_COMPILER='/home/myname/mingw-w64/mingw-w64-x86_64/bin/x86_64-w64-mingw32-windres' -DCMAKE_CXX_FLAGS="-static-libgcc -static-libstdc++" -DCMAKE_C_FLAGS="-static-libgcc -static-libstdc++" -DCMAKE_TOOLCHAIN_FILE='/home/myname/x265/build/linux/build.cmake' ../../../source -DHIGH_BIT_DEPTH=ON -DEXPORT_C_API=OFF -DENABLE_SHARED=OFF -DENABLE_CLI=OFF -DMAIN12=ON
make ${MAKEFLAGS}

build.cmake file is not much important here, but it contains:

SET(CMAKE_SYSTEM_NAME Windows)
SET(CMAKE_ASM_YASM_COMPILER yasm)

Any ideas how to make -static-libstdc++ work? I tried linking it in many folders, but I couldn't find out where is ld looking for it.


Solution

  • I managed to solve this. Source of my confusion was the fact that you can use -static-libgcc, so I thought even -static-libstdc++ should work. The problem was that there indeed were libraries, but not the .a files for libstdc++. These can be disabled using this parameter when using the script. Then both -static-lib options work well.

    bash ./mingw-w64-build-3.6.7 --disable-shared