Search code examples
c++macoslinker-errorscodelitesdl-image

Linking SDL_image using macOS


So I'm trying to create a simple 2D game engine with SDL2 and Codelite. I have already written this code and compiled it with gcc, using g++ src/*.cpp -o game -I include -L lib -lSDL2 -lSDL2_image and it didn't work. I have a lib folder containing all the libs for SDL2 and SDL_image, and an include folder with all the header files of the SDL. I also tried to compile this in Codelite so I recreated the same file structure and I linked SDL. It worked perfectly until I tried to use SDL_image. In the Project settings -> Linker and Project settings -> Compiler tabs, I have put the same paths from where I got the include files and the lib files that I used in my previous project, but it doesn't compile. I get this error:

Undefined symbols for architecture arm64:
  "_TIFFClientOpen", referenced from:
      _IMG_LoadTIF_RW in libSDL2_image.a(IMG_tif.o)
  "_TIFFClose", referenced from:
      _IMG_LoadTIF_RW in libSDL2_image.a(IMG_tif.o)
  "_TIFFGetField", referenced from:
      _IMG_LoadTIF_RW in libSDL2_image.a(IMG_tif.o)
  "_TIFFReadRGBAImageOriented", referenced from:
      _IMG_LoadTIF_RW in libSDL2_image.a(IMG_tif.o)
  "_WebPDecodeRGBAInto", referenced from:
      _IMG_LoadWEBP_RW in libSDL2_image.a(IMG_webp.o)
  "_WebPDecodeRGBInto", referenced from:
      _IMG_LoadWEBP_RW in libSDL2_image.a(IMG_webp.o)
  "_WebPGetFeaturesInternal", referenced from:
      _IMG_LoadWEBP_RW in libSDL2_image.a(IMG_webp.o)
  "_jpeg_CreateCompress", referenced from:
      _IMG_SaveJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_CreateDecompress", referenced from:
      _IMG_LoadJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_calc_output_dimensions", referenced from:
      _IMG_LoadJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_destroy_compress", referenced from:
      _IMG_SaveJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_destroy_decompress", referenced from:
      _IMG_LoadJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_finish_compress", referenced from:
      _IMG_SaveJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_finish_decompress", referenced from:
      _IMG_LoadJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_read_header", referenced from:
      _IMG_LoadJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_read_scanlines", referenced from:
      _IMG_LoadJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_resync_to_restart", referenced from:
      _IMG_InitJPG in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_set_defaults", referenced from:
      _IMG_SaveJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_set_quality", referenced from:
      _IMG_SaveJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_start_compress", referenced from:
      _IMG_SaveJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_start_decompress", referenced from:
      _IMG_LoadJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_std_error", referenced from:
      _IMG_LoadJPG_RW in libSDL2_image.a(IMG_jpg.o)
      _IMG_SaveJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_jpeg_write_scanlines", referenced from:
      _IMG_SaveJPG_RW in libSDL2_image.a(IMG_jpg.o)
  "_png_create_info_struct", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
  "_png_create_read_struct", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_create_write_struct", referenced from:
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
  "_png_destroy_read_struct", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_destroy_write_struct", referenced from:
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
  "_png_get_IHDR", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_get_PLTE", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_get_channels", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_get_io_ptr", referenced from:
      _png_read_data in libSDL2_image.a(IMG_png.o)
      _png_write_data in libSDL2_image.a(IMG_png.o)
  "_png_get_tRNS", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_get_valid", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_read_image", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_read_info", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_read_update_info", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_set_IHDR", referenced from:
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
  "_png_set_PLTE", referenced from:
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
  "_png_set_expand", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_set_gray_to_rgb", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_set_interlace_handling", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_set_longjmp_fn", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
  "_png_set_packing", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_set_read_fn", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_set_rows", referenced from:
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
  "_png_set_strip_16", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_set_tRNS", referenced from:
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
  "_png_set_write_fn", referenced from:
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
  "_png_write_png", referenced from:
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

I really don't know where is the problem, because SDL links properly. I use a MacBook Air with M1 processor, macOS Monterey 12.6 and Codelite 16.6.9, which is the latest version I believe. I downloaded it using the official documentation.


Solution

  • I finally found the way to link SDL on macOS. First, you need to download the DMG installer here. Then you have to copy-paste the folder which is in the installer you just downloaded (the name must be ending in .framework, e.g SDL2.framework) in /Library/Frameworks/. So the path of the SDL framework (or any SDL-related framework, e.g SDL2_image) will be: /Library/Frameworks/SDL2.framework. Then, in order to compile your code, you will have to run ths command:

    g++ main.cpp -F/Library/Frameworks -framework SDL2 -F/Library/Frameworks -framework SDL_image -I include -o mygame
    

    This command assumes that all the SDL header files (SDL.h) are in the root folder of your project in a folder called include. If it is not the case, you can find them in /Library/Frameworks/SDL2.framework/Headers/SDL2.