I use cmake to organize my project, here is my CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(Game)
set(CMAKE_CXX_COMPILER "llvm-g++")
# Find SDL2 packages
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_ttf REQUIRED)
find_package(SDL2_mixer REQUIRED)
# add Header file
include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS} ${SDL2_MIXER_INCLUDE_DIRS})
# Add source files
set(SOURCES
main.cpp
Base/BasePlus.cpp
)
add_compile_options(-std=c++11)
add_compile_options(-Wall)
add_executable(a.out ${SOURCES})
# link lib
target_link_libraries(a.out ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES} ${SDL2_TTF_LIBRARIES} ${SDL2_MIXER_LIBRARIES})
Then I used cmake command, and it worked well, looks like:
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/Jacket/Documents/GameFramwork/build
But when I tried to run make in build directory, it came out with this:
[ 33%] Linking CXX executable a.out
Undefined symbols for architecture arm64:
"_IMG_Init", referenced from:
BasePlus::BasePlus() in BasePlus.cpp.o
"_IMG_Load", referenced from:
BasePlus::loadTextureColorKey(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, int, int) in BasePlus.cpp.o
"_IMG_LoadTexture", referenced from:
BasePlus::loadTexture(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in BasePlus.cpp.o
"_IMG_Quit", referenced from:
BasePlus::~BasePlus() in BasePlus.cpp.o
"_Mix_CloseAudio", referenced from:
BasePlus::~BasePlus() in BasePlus.cpp.o
"_Mix_FreeMusic", referenced from:
BasePlus::~BasePlus() in BasePlus.cpp.o
"_Mix_Init", referenced from:
BasePlus::BasePlus() in BasePlus.cpp.o
"_Mix_LoadMUS", referenced from:
BasePlus::loadMusic(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in BasePlus.cpp.o
"_Mix_OpenAudio", referenced from:
BasePlus::BasePlus() in BasePlus.cpp.o
"_Mix_Quit", referenced from:
BasePlus::~BasePlus() in BasePlus.cpp.o
"_TTF_CloseFont", referenced from:
BasePlus::~BasePlus() in BasePlus.cpp.o
"_TTF_Init", referenced from:
BasePlus::BasePlus() in BasePlus.cpp.o
"_TTF_OpenFont", referenced from:
BasePlus::loadFont(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int) in BasePlus.cpp.o
"_TTF_Quit", referenced from:
BasePlus::~BasePlus() in BasePlus.cpp.o
"_TTF_RenderText_Blended_Wrapped", referenced from:
BasePlus::loadFontToTexture(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, SDL_Color) in BasePlus.cpp.o
"_TTF_SetFontHinting", referenced from:
BasePlus::loadFont(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int) in BasePlus.cpp.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [a.out] Error 1
make[1]: *** [CMakeFiles/a.out.dir/all] Error 2
make: *** [all] Error 2
I guess it was caused by linking problem, and I did find some answers on StackOverFlow, but they just not work for me, it confuses me for a few days, while SDL_Init() function works but the other not.
I am using MacOS M1, downloaded sdl2_image ttf mixer from GitHub and dragged it to /Library/Frameworks, by the way, all the framework runs well in Xcode but not with command line