How to setup a C++ project with MySQL Connector and Make
-
despite having developed applications in C++ for about two to three years, I never had to setup a project on my own. Most of the project were preconfigured thus I never learned to do it myself. Having lecture-free time at the moment, I thought to myself: "I am going to create my first own CMake C++ project".
Because I knew I wanted to store information in a database,I set off to create a simple CMake project with one executable linked to the MySQL Connector for C++, and instantly failed...
Since I - oddly - could not find helpful information anywhere else, I hope one of you could be my savior.
My project is setup as follows:
Root - CMakeLists.txt - build - src - tests -- main.cpp - include -- mysql_connection.h -- cppconn --- driver.h --- exception.h --- resultset.h --- statement.h --- ... -- ... - libs -- libmysqlcppconn.dylib -> libmysqlcppconn.7.8.0.12.dylib (symlink) -- libmysqlcppconn.7.8.0.12.dylib -- libmysqlcppconn8.1.8.0.12.dylib -- libmysqlcppconn8.1.dylib -> libmysqlcppconn8.1.8.0.12.dylib (symlink) -- libmysqlcppconn8.dylib -> libmysqlcppconn8.1.8.0.12.dylib (symlink) -- libssl.dylib -- libcrypto.dylib -- ...
My
main.cpp
contains:#include "mysql_connection.h" #include <cppconn/driver.h> #include <cppconn/exception.h> #include <cppconn/resultset.h> #include <cppconn/statement.h> int main(int argc, char const *argv[]) { sql::Driver *driver; sql::Connection *con; driver = get_driver_instance(); con = driver->connect("tcp://127.0.0.1:3306","root","securepw"); return 0; }
And my
CMakeLists.txt
:cmake_minimum_required(VERSION 3.0) project(EconSim) add_executable(EconSim ${PROJECT_SOURCE_DIR}/tests/main.cpp) target_include_directories(EconSim PUBLIC ${PROJECT_SOURCE_DIR}/include) target_link_libraries(EconSim ${PROJECT_SOURCE_DIR}/libs/libmysqlcppconn.dylib) target_compile_features(EconSim PUBLIC cxx_std_17)
I am able to compile the application but I get the following error when executing it:
dyld: Library not loaded: libmysqlcppconn.7.dylib Referenced from: /Users/aosterthun/Documents/Programming/EconSim/build/./EconSim Reason: image not found Abort trap: 6
When instead using
libmysqlcppconn8.dylib
in theCMakeLists.txt
:
And myCMakeLists.txt
:cmake_minimum_required(VERSION 3.0) project(EconSim) add_executable(EconSim ${PROJECT_SOURCE_DIR}/tests/main.cpp) target_include_directories(EconSim PUBLIC ${PROJECT_SOURCE_DIR}/include) target_link_libraries(EconSim ${PROJECT_SOURCE_DIR}/libs/libmysqlcppconn8.dylib) target_compile_features(EconSim PUBLIC cxx_std_17)
I get a compile error:
[build] Starting build [proc] Executing command: /usr/local/bin/cmake --build /Users/aosterthun/Documents/Programming/EconSim/build --config Debug --target all -- -j 6 [build] [ 50%] Linking CXX executable EconSim [build] Undefined symbols for architecture x86_64: [build] "_get_driver_instance", referenced from: [build] _main in main.cpp.o [build] ld: symbol(s) not found for architecture x86_64 [build] clang: error: linker command failed with exit code 1 (use -v to see invocation) [build] make[2]: *** [EconSim] Error 1 [build] make[1]: *** [CMakeFiles/EconSim.dir/all] Error 2 [build] make: *** [all] Error 2 [build] Build finished with exit code 2
I found this: How do I link C++ MySQL Connector Libraries to Cmake? but that sadly did not solve my problem.
I also found CLion: undefined “_get_driver_instance” which resulted in this
CMakeLists.txt
:cmake_minimum_required(VERSION 3.0) project(EconSim) include_directories(${PROJECT_SOURCE_DIR}/include) add_library(libmysqlcppconn STATIC IMPORTED) add_executable(EconSim ${PROJECT_SOURCE_DIR}/tests/main.cpp) set_property(TARGET libmysqlcppconn PROPERTY IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/libs/libmysqlcppconn-static.a) target_compile_features(EconSim PUBLIC cxx_std_17) target_link_libraries(EconSim libmysqlcppconn)
Which then results in this error:
[build] Starting build [proc] Executing command: /usr/local/bin/cmake --build /Users/aosterthun/Documents/Programming/EconSim/build --config Debug --target all -- -j 6 [build] [ 50%] Linking CXX executable EconSim [build] Undefined symbols for architecture x86_64: [build] "_BIO_free", referenced from: [build] sha256_password_auth_client(MYSQL_PLUGIN_VIO*, MYSQL*) in libmysqlcppconn-static.a(client_authentication.cc.o) [build] caching_sha2_password_auth_client(MYSQL_PLUGIN_VIO*, MYSQL*) in libmysqlcppconn-static.a(client_authentication.cc.o) [build] "_BIO_new_bio_pair", referenced from: [build] dummy_function_needed_by_xplugin() in libmysqlcppconn-static.a(my_aes_openssl.cc.o) [build] "_BIO_new_mem_buf", referenced from: [build] sha256_password_auth_client(MYSQL_PLUGIN_VIO*, MYSQL*) in libmysqlcppconn-static.a(client_authentication.cc.o) [build] caching_sha2_password_auth_client(MYSQL_PLUGIN_VIO*, MYSQL*) in libmysqlcppconn-static.a(client_authentication.cc.o) [build] "_BN_bin2bn", refer...
I would appreciate any help. Even a hint to an obvious solution I have not found. I am still a bit confused why I did not find helpful information on this topic. Cause there should be lots of people developing with this technology.
Just ask for further information if I missed any.
-
This is due to macos linker working different than other unix systems.
Adding include paths to
DYLD_LIBRARY_PATH
should be sufficient.See CMake wiki for further info.