1

I trying to superbuild mysql-connector-cpp in my project. Here is my file tree:

src/
├─ app/
├─ common/
├─ core/
├─ CMakeLists.txt
ThirdParty/
├─ mysql-connector-cpp/
├─ CMakeLists.txt
CMakeLists.txt

root/CMakeLists.txt:

make_minimum_required (VERSION 3.5)

# set the build type
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif(NOT CMAKE_BUILD_TYPE)

if(CMAKE_BUILD_TYPE MATCHES Debug)
  message("Debug build.")
elseif(CMAKE_BUILD_TYPE MATCHES Release)
  message("Release build.")
endif()

set(application_name "cmake-project-template")
set(CMAKE_CXX_STANDARD 17)
set(application_version "1.0.2")
set(PROJECT_VER ${application_version})

cmake_policy(SET CMP0048 NEW)

project (${application_name} LANGUAGES C CXX)

# set search path for CMake modules
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
find_package(PCAP REQUIRED)

add_subdirectory(ThirdParty)
add_subdirectory(src)

ThirdParty/CMakeLists.txt:

include(ExternalProject)

set(MYSQL_CONNECTOR_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/mysql-connector-cpp_Build)

ExternalProject_Add(mysql-connector-cpp_Proj
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/mysql-connector-cpp
    BINARY_DIR ${MYSQL_CONNECTOR_BINARY_DIR}
    USES_TERMINAL_CONFIGURE TRUE
    USES_TERMINAL_BUILD TRUE
    CMAKE_ARGS
        ${opt_args}
        -DCMAKE_INSTALL_PREFIX=${MYSQL_CONNECTOR_BINARY_DIR}/install
        -DWITH_JDBC=ON
        -DBUILD_STATIC=ON
)

add_library(mysql-connector-cpp INTERFACE)
set_target_properties(mysql-connector-cpp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${MYSQL_CONNECTOR_BINARY_DIR}/include)
add_dependencies(mysql-connector-cpp mysql-connector-cpp_Proj)

src/app/CMakeLists.txt:

set(source
    src/main.cpp
    src/appLib.cpp
)

add_library(app ${source})


target_include_directories(app PUBLIC inc)
target_include_directories(app PRIVATE inc/app)

target_link_libraries(app PUBLIC
common
core
mysql-connector-cpp)

add_dependencies(app mysql-connector-cpp)

# TODO:
add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} app core)

Build message:

CMakeFiles/cmake-project-template.dir/src/main.cpp.o: In function `main':
main.cpp:(.text.startup+0x131): undefined reference to `check(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
main.cpp:(.text.startup+0x178): undefined reference to `check(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)'
main.cpp:(.text.startup+0x191): undefined reference to `sql::mysql::_get_driver_instance_by_name(char const*)'
collect2: error: ld returned 1 exit status
gmake[2]: *** [src/app/CMakeFiles/cmake-project-template.dir/build.make:101: src/app/cmake-project-template] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:241: src/app/CMakeFiles/cmake-project-template.dir/all] Error 2
gmake: *** [Makefile:136: all] Error 2
Shadow
  • 33,525
  • 10
  • 51
  • 64
  • 1
    You forgot to tell CMake what the actual .a or .so file behind mysql-connector-cpp is. Also, shouldn't your `INTERFACE_INCLUDE_DIRECTORIES` be `${MYSQL_CONNECTOR_BINARY_DIR}/install/include` ? – Botje Sep 01 '23 at 13:15
  • @Botje Thanks for your answer. How can I tell what the actual .a or .so file behind mysql-connector-cpp is? – cinargursoy Sep 01 '23 at 13:48
  • "How can I tell what the actual .a or .so file behind mysql-connector-cpp is" - via `target_link_libraries(mysql-connector-cpp INTERFACE – Tsyvarev Sep 01 '23 at 14:34
  • @Tsyvarev I updated `ThirdParty/CMakeLists.txt` as below: `add_library(mysql-connector-cpp INTERFACE)` `set_target_properties(mysql-connector-cpp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${MYSQL_CONNECTOR_BINARY_DIR}/install/include)` `target_link_libraries(mysql-connector-cpp INTERFACE ${MYSQL_CONNECTOR_BINARY_DIR}/install/lib64/debug/libmysqlcppconn-static.a)` `add_dependencies(mysql-connector-cpp mysql-connector-cpp_Proj)` But I'm still getting linkage errors. I also tried doing with `set_target_properties` as you said, but that time compiler cannot find "jdbc/cppconn/exception.h" – cinargursoy Sep 01 '23 at 17:53
  • "But I'm still getting linkage errors" - Do you get the **same errors** or some other ones? Note, that beside of linking with `libmysqlcppconn-static.a`, you need to link with MySQL library itself. This is because linking with a **static** library doesn't automatically link with the libraries it depends on. – Tsyvarev Sep 01 '23 at 20:06
  • Other ones; `../../ThirdParty/mysql-connector-cpp_Build/install/lib64/debug/libmysqlcppconn-static.a(libjdbc_mysql_client_api.cpp.o): In function `sql::mysql::NativeAPI::LibmysqlStaticProxy::thread_init()': /home/cinargursoy/workspace/cmake-project-template/build/ThirdParty/mysql-connector-cpp_Build/jdbc/driver/./jdbc/driver/nativeapi/libmysql_static_proxy.cpp:730: undefined reference to `mysql_thread_init' collect2: error: ld returned 1 exit status`. Linking MySQL library itself wouldn't be an option. Because building `mysql-connector-cpp` already uses ~15GB RAM :S – cinargursoy Sep 01 '23 at 21:13

0 Answers0