I am developping a little bot to handle friendly bets with my friends on discord. I use the D++ library for the discord server part.
Until now, I have been working using Visual Studio with WSL and it was working fine. But since I would like to try C++ modules I would need a CMake version higher than 3.19 and it seems that VS-WSL can't go higher (but that's another question). So I decided to simply get my repository in my WSL session and to compile it manually. I also took the opportunity to update to clang 18.
CMake generation works fine, the compilations works fine but when it comes to the link I have the following error:
/usr/bin/ld: CMakeFiles/BetBot.dir/src/SaveManager.cpp.o: undefined reference to symbol '_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1ERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21' /usr/bin/ld: /lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line clang-18: error: linker command failed with exit code 1 (use -v to see invocation)
My CMake :
cmake_minimum_required(VERSION 3.28)
project(BetBot VERSION 1.0 DESCRIPTION "A simple discord bot to handle friendly bets.")
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
add_executable(${PROJECT_NAME}
"src/main.cpp"
"src/AddBetCommand.cpp"
"src/AddBetCommand.h"
"src/AddMatchCommand.cpp"
"src/AddMatchCommand.h"
"src/AddResultCommand.cpp"
"src/AddResultCommand.h"
"src/Bet.cpp"
"src/Bet.h"
"src/BettorResults.cpp"
"src/BettorResults.h"
"src/ICommand.cpp"
"src/ICommand.h"
"src/ICommandReceiver.cpp"
"src/ICommandReceiver.h"
"src/BotData.cpp"
"src/BotData.h"
"src/Match.cpp"
"src/Match.h"
"src/MatchScore.h"
"src/ShowBetsCommand.cpp"
"src/ShowBetsCommand.h"
"src/ShowBettorsResultsCommand.cpp"
"src/ShowBettorsResultsCommand.h"
"src/ShowMatchesCommand.cpp"
"src/ShowMatchesCommand.h"
"src/JsonSerializer.cpp"
"src/JsonSerializer.h"
"src/SaveManager.cpp"
"src/SaveManager.h"
"src/BetBot.cpp"
"src/BetBot.h"
)
find_package(DPP REQUIRED)
target_link_libraries(${PROJECT_NAME}
${DPP_LIBRARIES}
)
target_include_directories(${PROJECT_NAME} PRIVATE
${DPP_INCLUDE_DIR}
)
set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
)
I am very new to CMake so I must admit that I don't fully understand what each command of my file does, but it was working when I was working with WSL.
From what I have found on the net, there might be a problem with my target_link_libraries but I don't see what else I could do here.
EDIT : Here is the content of the SaveManager.cpp
#include "SaveManager.h"
#include <fstream>
#include "BotData.h"
#include "JsonSerializer.h"
SaveManager::SaveManager(std::string filePath, BotData& data): m_SaveFilePath(std::move(filePath)), m_Data(data)
{
m_Serializer = std::make_unique<JsonSerializer>();
}
void SaveManager::Save() const
{
std::ofstream os(m_SaveFilePath, std::ofstream::out);
m_Serializer->Serialize(m_Data, os);
os.close();
}
void SaveManager::Load() const
{
if (std::ifstream is(m_SaveFilePath); is.good()) // does file exists ?
{
m_Serializer->UnSerialize(is, m_Data);
is.close();
}
}
Edit 2: The full command used to build
@DESKTOP-VP8IL4T:/mnt/c/Users/Benjamin/wsl/LoLBetBot/out$ make VERBOSE=1
/mnt/c/Users/Benjamin/cmake/cmake-3.29.2-linux-x86_64/bin/cmake -S/mnt/c/Users/Benjamin/wsl/LoLBetBot -B/mnt/c/Users/Benjamin/wsl/LoLBetBot/out --check-build-system CMakeFiles/Makefile.cmake 0
/mnt/c/Users/Benjamin/cmake/cmake-3.29.2-linux-x86_64/bin/cmake -E cmake_progress_start /mnt/c/Users/Benjamin/wsl/LoLBetBot/out/CMakeFiles /mnt/c/Users/Benjamin/wsl/LoLBetBot/out//CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/mnt/c/Users/Benjamin/wsl/LoLBetBot/out'
make -f CMakeFiles/BetBot.dir/build.make CMakeFiles/BetBot.dir/depend
make[2]: Entering directory '/mnt/c/Users/Benjamin/wsl/LoLBetBot/out'
cd /mnt/c/Users/Benjamin/wsl/LoLBetBot/out && /mnt/c/Users/Benjamin/cmake/cmake-3.29.2-linux-x86_64/bin/cmake -E cmake_depends "Unix Makefiles" /mnt/c/Users/Benjamin/wsl/LoLBetBot /mnt/c/Users/Benjamin/wsl/LoLBetBot /mnt/c/Users/Benjamin/wsl/LoLBetBot/out /mnt/c/Users/Benjamin/wsl/LoLBetBot/out /mnt/c/Users/Benjamin/wsl/LoLBetBot/out/CMakeFiles/BetBot.dir/DependInfo.cmake "--color="
make[2]: Leaving directory '/mnt/c/Users/Benjamin/wsl/LoLBetBot/out'
make -f CMakeFiles/BetBot.dir/build.make CMakeFiles/BetBot.dir/build
make[2]: Entering directory '/mnt/c/Users/Benjamin/wsl/LoLBetBot/out'
[ 5%] Linking CXX executable BetBot
/mnt/c/Users/Benjamin/cmake/cmake-3.29.2-linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/BetBot.dir/link.txt --verbose=1
/usr/bin/clang-18 CMakeFiles/BetBot.dir/src/main.cpp.o CMakeFiles/BetBot.dir/src/AddBetCommand.cpp.o CMakeFiles/BetBot.dir/src/AddMatchCommand.cpp.o CMakeFiles/BetBot.dir/src/AddResultCommand.cpp.o CMakeFiles/BetBot.dir/src/Bet.cpp.o CMakeFiles/BetBot.dir/src/BettorResults.cpp.o CMakeFiles/BetBot.dir/src/ICommand.cpp.o CMakeFiles/BetBot.dir/src/ICommandReceiver.cpp.o CMakeFiles/BetBot.dir/src/BotData.cpp.o CMakeFiles/BetBot.dir/src/Match.cpp.o CMakeFiles/BetBot.dir/src/ShowBetsCommand.cpp.o CMakeFiles/BetBot.dir/src/ShowBettorsResultsCommand.cpp.o CMakeFiles/BetBot.dir/src/ShowMatchesCommand.cpp.o CMakeFiles/BetBot.dir/src/JsonSerializer.cpp.o CMakeFiles/BetBot.dir/src/SaveManager.cpp.o CMakeFiles/BetBot.dir/src/BetBot.cpp.o -o BetBot /usr/lib/libdpp.so
/usr/bin/ld: CMakeFiles/BetBot.dir/src/SaveManager.cpp.o: undefined reference to symbol '_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1ERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21'
/usr/bin/ld: /lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line
clang-18: error: linker command failed with exit code 1 (use -v to see invocation)
Comment from @Tsyvarev
"Then I used export CXX=clang-18" - So you have assigned C compiler to the variable which is intended for C++ compiler. See e.g. stackoverflow.com/a/49258166/3440745
Thanks for the help !