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.
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
.