2

I'm working on cross-compiling SFML from Linux to Windows. I've installed all the dependencies. When I try to build the SFML library, it goes all right for the first bit, building system, network and window. However, on getting to building sfml-graphics, it does alright, but can't link the library.

[ 16%] Built target sfml-system
[ 18%] Built target sfml-main
[ 39%] Built target sfml-window
[ 50%] Built target sfml-network
[ 51%] Linking CXX shared library ../../../lib/sfml-graphics-2.dll
/usr/lib/gcc/i686-w64-mingw32/6.2-posix/../../../../i686-w64-mingw32/lib/../lib/libfreetype.a(sfnt.o): In function `Load_SBit_Png':
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:209: undefined reference to `png_create_read_struct'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:219: undefined reference to `png_create_info_struct'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:227: undefined reference to `png_set_longjmp_fn'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:326: undefined reference to `png_destroy_read_struct'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:233: undefined reference to `png_set_read_fn'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:235: undefined reference to `png_read_info'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:236: undefined reference to `png_get_IHDR'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:254: undefined reference to `png_set_expand_gray_1_2_4_to_8'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:261: undefined reference to `png_get_valid'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:276: undefined reference to `png_set_interlace_handling'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:278: undefined reference to `png_set_filler'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:281: undefined reference to `png_read_update_info'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:282: undefined reference to `png_get_IHDR'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:301: undefined reference to `png_set_read_user_transform_fn'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:223: undefined reference to `png_destroy_read_struct'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:248: undefined reference to `png_set_palette_to_rgb'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:273: undefined reference to `png_set_gray_to_rgb'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:268: undefined reference to `png_set_packing'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:265: undefined reference to `png_set_strip_16'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:262: undefined reference to `png_set_tRNS_to_alpha'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:319: undefined reference to `png_read_image'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:323: undefined reference to `png_read_end'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:306: undefined reference to `png_set_read_user_transform_fn'
/usr/lib/gcc/i686-w64-mingw32/6.2-posix/../../../../i686-w64-mingw32/lib/../lib/libfreetype.a(sfnt.o): In function `error_callback':
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:125: undefined reference to `png_get_error_ptr'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:132: undefined reference to `png_set_longjmp_fn'
/usr/lib/gcc/i686-w64-mingw32/6.2-posix/../../../../i686-w64-mingw32/lib/../lib/libfreetype.a(sfnt.o): In function `read_data_from_FT_Stream':
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:156: undefined reference to `png_get_io_ptr'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:162: undefined reference to `png_get_error_ptr'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:166: undefined reference to `png_error'
collect2: error: ld returned 1 exit status
src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/build.make:884: recipe for target 'lib/sfml-graphics-2.dll' failed
make[2]: *** [lib/sfml-graphics-2.dll] Error 1
CMakeFiles/Makefile2:339: recipe for target 'src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/all' failed
make[1]: *** [src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

I've tried specifying LDFLAGS before make, to no avail.

cmake -DCMAKE_TOOLCHAIN_FILE=/etc/toolchains/win32-tc.cmake -DCMAKE_INSTALL_PREFIX=/usr/i686-w64-mingw32 .. && LDFLAGS="-L/usr/i686-w64-mingw32/lib -lpng" sudo make all install

I have built libpng succesfully and listing /usr/i686-w64-mingw32/lib (my cross compilers lib directory) shows that the static libraries are there.

$ ls /usr/i686-w64-mingw32/lib | grep libpng
libpng
libpng16.a
libpng16.dll.a
libpng.a
libpng.dll.a

I don't know what could be going wrong. Does anybody have any clue? Thanks in advance.

EDIT: Providing more interesting output to try pinpoint the problem.

$ cmake -DCMAKE_TOOLCHAIN_FILE=/etc/toolchains/win32-tc.cmake -DCMAKE_INSTALL_PREFIX=/usr/i686-w64-mingw32 -DCMAKE_RULE_MESSAGES:BOOL=OFF -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON .. && sudo make --no-print-directory all install
-- Configuring done
-- Generating done
-- Build files have been written to: /home/chemicalchems/Downloads/SFML/build
/usr/bin/cmake -H/home/chemicalchems/Downloads/SFML -B/home/chemicalchems/Downloads/SFML/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/chemicalchems/Downloads/SFML/build/CMakeFiles /home/chemicalchems/Downloads/SFML/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make -f src/SFML/System/CMakeFiles/sfml-system.dir/build.make src/SFML/System/CMakeFiles/sfml-system.dir/depend
cd /home/chemicalchems/Downloads/SFML/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/chemicalchems/Downloads/SFML /home/chemicalchems/Downloads/SFML/src/SFML/System /home/chemicalchems/Downloads/SFML/build /home/chemicalchems/Downloads/SFML/build/src/SFML/System /home/chemicalchems/Downloads/SFML/build/src/SFML/System/CMakeFiles/sfml-system.dir/DependInfo.cmake --color=
make -f src/SFML/System/CMakeFiles/sfml-system.dir/build.make src/SFML/System/CMakeFiles/sfml-system.dir/build
make[2]: Nothing to be done for 'src/SFML/System/CMakeFiles/sfml-system.dir/build'.
[ 16%] Built target sfml-system
make -f src/SFML/Main/CMakeFiles/sfml-main.dir/build.make src/SFML/Main/CMakeFiles/sfml-main.dir/depend
cd /home/chemicalchems/Downloads/SFML/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/chemicalchems/Downloads/SFML /home/chemicalchems/Downloads/SFML/src/SFML/Main /home/chemicalchems/Downloads/SFML/build /home/chemicalchems/Downloads/SFML/build/src/SFML/Main /home/chemicalchems/Downloads/SFML/build/src/SFML/Main/CMakeFiles/sfml-main.dir/DependInfo.cmake --color=
make -f src/SFML/Main/CMakeFiles/sfml-main.dir/build.make src/SFML/Main/CMakeFiles/sfml-main.dir/build
make[2]: Nothing to be done for 'src/SFML/Main/CMakeFiles/sfml-main.dir/build'.
[ 18%] Built target sfml-main
make -f src/SFML/Window/CMakeFiles/sfml-window.dir/build.make src/SFML/Window/CMakeFiles/sfml-window.dir/depend
cd /home/chemicalchems/Downloads/SFML/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/chemicalchems/Downloads/SFML /home/chemicalchems/Downloads/SFML/src/SFML/Window /home/chemicalchems/Downloads/SFML/build /home/chemicalchems/Downloads/SFML/build/src/SFML/Window /home/chemicalchems/Downloads/SFML/build/src/SFML/Window/CMakeFiles/sfml-window.dir/DependInfo.cmake --color=
make -f src/SFML/Window/CMakeFiles/sfml-window.dir/build.make src/SFML/Window/CMakeFiles/sfml-window.dir/build
make[2]: Nothing to be done for 'src/SFML/Window/CMakeFiles/sfml-window.dir/build'.
[ 39%] Built target sfml-window
make -f src/SFML/Network/CMakeFiles/sfml-network.dir/build.make src/SFML/Network/CMakeFiles/sfml-network.dir/depend
cd /home/chemicalchems/Downloads/SFML/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/chemicalchems/Downloads/SFML /home/chemicalchems/Downloads/SFML/src/SFML/Network /home/chemicalchems/Downloads/SFML/build /home/chemicalchems/Downloads/SFML/build/src/SFML/Network /home/chemicalchems/Downloads/SFML/build/src/SFML/Network/CMakeFiles/sfml-network.dir/DependInfo.cmake --color=
make -f src/SFML/Network/CMakeFiles/sfml-network.dir/build.make src/SFML/Network/CMakeFiles/sfml-network.dir/build
make[2]: Nothing to be done for 'src/SFML/Network/CMakeFiles/sfml-network.dir/build'.
[ 50%] Built target sfml-network
make -f src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/build.make src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/depend
cd /home/chemicalchems/Downloads/SFML/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/chemicalchems/Downloads/SFML /home/chemicalchems/Downloads/SFML/src/SFML/Graphics /home/chemicalchems/Downloads/SFML/build /home/chemicalchems/Downloads/SFML/build/src/SFML/Graphics /home/chemicalchems/Downloads/SFML/build/src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/DependInfo.cmake --color=
make -f src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/build.make src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/build
cd /home/chemicalchems/Downloads/SFML/build/src/SFML/Graphics && /usr/bin/cmake -E cmake_link_script CMakeFiles/sfml-graphics.dir/link.txt --verbose=1
/usr/bin/cmake -E remove -f CMakeFiles/sfml-graphics.dir/objects.a
/usr/bin/ar cr CMakeFiles/sfml-graphics.dir/objects.a @CMakeFiles/sfml-graphics.dir/objects1.rsp
/usr/bin/i686-w64-mingw32-g++-posix   -O3 -DNDEBUG  -shared -o ../../../lib/sfml-graphics-2.dll -Wl,--out-implib,../../../lib/libsfml-graphics.a -Wl,--major-image-version,2,--minor-image-version,4 -Wl,--whole-archive CMakeFiles/sfml-graphics.dir/objects.a -Wl,--no-whole-archive @CMakeFiles/sfml-graphics.dir/linklibs.rsp
/usr/lib/gcc/i686-w64-mingw32/6.2-posix/../../../../i686-w64-mingw32/lib/../lib/libfreetype.a(sfnt.o): In function `Load_SBit_Png':
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:209: undefined reference to `png_create_read_struct'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:219: undefined reference to `png_create_info_struct'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:227: undefined reference to `png_set_longjmp_fn'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:326: undefined reference to `png_destroy_read_struct'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:233: undefined reference to `png_set_read_fn'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:235: undefined reference to `png_read_info'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:236: undefined reference to `png_get_IHDR'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:254: undefined reference to `png_set_expand_gray_1_2_4_to_8'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:261: undefined reference to `png_get_valid'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:276: undefined reference to `png_set_interlace_handling'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:278: undefined reference to `png_set_filler'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:281: undefined reference to `png_read_update_info'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:282: undefined reference to `png_get_IHDR'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:301: undefined reference to `png_set_read_user_transform_fn'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:223: undefined reference to `png_destroy_read_struct'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:248: undefined reference to `png_set_palette_to_rgb'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:273: undefined reference to `png_set_gray_to_rgb'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:268: undefined reference to `png_set_packing'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:265: undefined reference to `png_set_strip_16'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:262: undefined reference to `png_set_tRNS_to_alpha'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:319: undefined reference to `png_read_image'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:323: undefined reference to `png_read_end'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:306: undefined reference to `png_set_read_user_transform_fn'
/usr/lib/gcc/i686-w64-mingw32/6.2-posix/../../../../i686-w64-mingw32/lib/../lib/libfreetype.a(sfnt.o): In function `error_callback':
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:125: undefined reference to `png_get_error_ptr'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:132: undefined reference to `png_set_longjmp_fn'
/usr/lib/gcc/i686-w64-mingw32/6.2-posix/../../../../i686-w64-mingw32/lib/../lib/libfreetype.a(sfnt.o): In function `read_data_from_FT_Stream':
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:156: undefined reference to `png_get_io_ptr'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:162: undefined reference to `png_get_error_ptr'
/home/chemicalchems/Downloads/libfreetype/src/sfnt/pngshim.c:166: undefined reference to `png_error'
collect2: error: ld returned 1 exit status
src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/build.make:854: recipe for target 'lib/sfml-graphics-2.dll' failed
make[2]: *** [lib/sfml-graphics-2.dll] Error 1
CMakeFiles/Makefile2:342: recipe for target 'src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/all' failed
make[1]: *** [src/SFML/Graphics/CMakeFiles/sfml-graphics.dir/all] Error 2
Makefile:130: recipe for target 'all' failed
make: *** [all] Error 2

EDIT 2: Toolchain file requested

SET(CMAKE_SYSTEM_NAME Windows)

SET(COMPILER_PREFIX i686-w64-mingw32)

SET(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc-posix)
SET(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-g++-posix)
SET(CMAKE_RC_COMPILER ${COMPILER_PREFIX}-windres)

SET(CMAKE_FIND_ROOT_PATH /usr/${COMPILER_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_INSTALL_PREFIX:PATH /usr/${COMPILER_PREFIX})
benathon
  • 7,455
  • 2
  • 41
  • 70
ChemiCalChems
  • 612
  • 12
  • 31
  • If this is on windows its probably an issue because of the .a Libraries on windows are usually .dll and .lib, while libraries on linux are .so or .a So I guess the question would be are you sure your building the libpng correctly for windows? – AresCaelum Jan 09 '17 at 14:36
  • A quick test would be to grab the libpng that comes with sfml from their site. – AresCaelum Jan 09 '17 at 14:37
  • @Eddge Yes, I cross-compiled libpng for Windows. They don't seem to need libpng by itself, rather, they need libfreetype, which in turns needs libpng. – ChemiCalChems Jan 09 '17 at 14:39
  • the undefined reference error is coming from linfreetype because it cant find the references in libpng, your files all end with the .a extensions which aren't compatible with windows. – AresCaelum Jan 09 '17 at 14:40
  • normally compiling for both linux and windows will produce both the .dll and the .a files, in your instance it produced your .a, and your .dll are also ending with .a which could possibly be your window libraries, but due to the way its compiling it could be appending the .a to the end of your .dll's which would then be ignored on windows because its not considered a windows library. – AresCaelum Jan 09 '17 at 14:46
  • @Eddge I'm cross-compiling on linux, and I only have .a files in my lib directory, no .lib. If g++ is finding freetype, without it being a .lib, it shouldn't have a problem with libpng either, I'd expect. – ChemiCalChems Jan 09 '17 at 14:51
  • can you run it with the commands from this thread? http://stackoverflow.com/questions/2670121/using-cmake-with-gnu-make-how-can-i-see-the-exact-commands specifically the `-DCMAKE_RULE_MESSAGES:BOOL=OFF -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON . make --no-print-directory` – AresCaelum Jan 09 '17 at 14:58
  • That should give us some more helpful information on what's going on with it. – AresCaelum Jan 09 '17 at 14:59
  • also what happens with that last command if you remove the `&&` before the LDFLAGS? – AresCaelum Jan 09 '17 at 15:03
  • @Eddge I can't remove that `&&', it splits the two commands. – ChemiCalChems Jan 09 '17 at 15:04
  • Well it looks like we should move this to chat, but the chat is blocked where I am at currently, so I would have to look at this again in about 3 hours, so hopefully someone else can come along before then and solve this. If not I'll be available to chat then to try and get this figured out with you. – AresCaelum Jan 09 '17 at 15:07
  • 2
    I think this is the line we have to concentrate on, I don't think it's linking libpng at all. `/usr/bin/i686-w64-mingw32-g++-posix -O3 -DNDEBUG -shared -o ../../../lib/sfml-graphics-2.dll -Wl,--out-implib,../../../lib/libsfml-graphics.a -Wl,--major-image-version,2,--minor-image-version,4 -Wl,--whole-archive CMakeFiles/sfml-graphics.dir/objects.a -Wl,--no-whole-archive @CMakeFiles/sfml-graphics.dir/linklibs.rsp` – ChemiCalChems Jan 09 '17 at 15:11
  • I missed some conversation but, is libfreetype correctly compiled and linked with libpng? Since it seems you're using libfreetype which you downloaded the source code (not system installation). Also, sharing the toolchain file would be helpful... – fedepad Jan 09 '17 at 15:15
  • @fedepad I'll add the toolchain file right now. And I would say libfreetype is correctly built, it didn't complain at all, though I'm not sure whether it linked against libpng, maybe that's the problem. – ChemiCalChems Jan 09 '17 at 15:17
  • For anyone still interested, I somehow manage to solve the problem though I'm not quite sure what went wrong. It was definitely something with libpng not building correctly, had nothing to do with libfreetype. After playing around with libpng, I cleaned and rebuilt and was greeted with a flawless install. – ChemiCalChems Jan 09 '17 at 22:24
  • FYI: SFML doesn't use libpng, so not exactly sure why there are undefined references to it. – Lukas Jan 10 '17 at 12:36
  • @Lukas libfreetype is used though, and libpng is a dependency of libfreetype – ChemiCalChems Jan 10 '17 at 13:12
  • You must be using an odd version of FreeType then, because they usually don't have any dependencies. From their website: "Apart from a standard ANSI C library, FreeType doesn't have any external dependencies and can be compiled and installed on its own on any kind of system" – Lukas Jan 11 '17 at 03:06
  • @Lukas Correction: I think it's that it uses libpng by default, even though it's not needed, since you can choose not to use libpng. – ChemiCalChems Jan 11 '17 at 09:59

1 Answers1

1

If all you need to do is to build SFML for Windows via cross-compiling - one other way is to use the MXE cross-compiling environment. That way you just need to:

  1. download the MXE package or clone the Git repo
  2. cd into the directory
  3. edit/create the settings.mk config file as appropriate
  4. execute make sfml

MXE then downloads and builds all the dependencies needed for SFML automatically.

MXE tutorial: http://mxe.cc/#tutorial

Example settings.mk file:

# This variable controls the number of compilation processes
# within one package ("intra-package parallelism").
JOBS := 12

# This variable controls the targets that will build.
#MXE_TARGETS :=  i686-w64-mingw32.static i686-w64-mingw32.shared  x86_64-w64-mingw32.static x86_64-w64-mingw32.shared
MXE_TARGETS :=  x86_64-w64-mingw32.static

This doesn't really help you with the build error but I am posting it here just in case you aren't able to solve it and you want to try other solutions, and also for other people trying to cross-compile SFML.

omusil
  • 289
  • 2
  • 10