Kết nối với mysql bằng c++?

Em biết điều này rất xàm xí, nhưng hiện em đang muốn làm một hệ thống microservice bằng grpc với mysql bằng c++. Nếu như sử dụng mongodb thì có thể parse protocol buffer sang json rồi parse json sang bson rất dễ. Nhưng với sql hay mysql thì em mù tịt vì không biết nên sử dụng library nào cho sql client, em vẫn tìm được một vài library ngoài kia như: sqlpp11, mysql-connector-cpp, odb; trong số này sqlpp11 hoặc odb thì sử dụng có vẻ đau khổ. mysql-connector-cpp api trông ổn hơn vì sử dụng json, nhưng dependencies lại build với protocol buffers, và bị build fail nếu kết hợp build với grpc; tóm lại là dùng ko được. Và dường như cũng không nhiều người chọn làm giống vầy. Em mong được tư vấn thêm ạ.

không hiểu? mysql thì liên quan gì grpc?

Các service giao tiếp với nhau bằng grpc, mỗi service giao tiếp với database mysql. Đặt riêng ra thì nó không liên quan ạ, em chỉ trình bày ngữ cảnh của em thôi. :smiley_cat:

mới đầu đọc không hiểu, nhưng có bạn đang bị vấn đề là conflict giữa dependencies của protobuf grpc và dependencies của ORM cho C++ đúng không?

Trong 3 thư viện tìm được thì chỉ có thư viện mysql-connector-cpp bị conflict ạ, em build bằng vcpkg bằng manifest mode, nếu để lib đó và protobuf build chung thì sẽ bị conflict. 2 thư viện kia build được nhưng api khó dùng em cảm thấy khó để đi xa được.

1 Like

conflict gì đưa lỗi lên mình xem thử được ko :V
mình ko sửa được thì tạo issue trên vcpkg github nội trong 1 ngày là có người giải quyết à :V

2 Likes

Trông nó thế này ạ

[cmake] -- Running vcpkg install - done
[cmake] -- Found RE2 via CMake.
[cmake] CMake Warning (dev) at /home/lmp/.local/lib/python3.10/site-packages/cmake/data/share/cmake-3.24/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
[cmake]   The package name passed to `find_package_handle_standard_args` (Protobuf)
[cmake]   does not match the name of the calling package (protobuf).  This can lead
[cmake]   to problems in calling code that expects `find_package` result variables
[cmake]   (e.g., `_FOUND`) to follow a certain pattern.
[cmake] Call Stack (most recent call first):
[cmake]   build/vcpkg_installed/x64-linux/share/protobuf/protobuf-module.cmake:162 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
[cmake]   build/vcpkg_installed/x64-linux/share/protobuf/protobuf-config.cmake:168 (include)
[cmake]   build/vcpkg_installed/x64-linux/share/protobuf/vcpkg-cmake-wrapper.cmake:16 (_find_package)
[cmake]   /home/lmp/vcpkg/scripts/buildsystems/vcpkg.cmake:788 (include)
[cmake]   support/cmake/ProvideProtobuf.cmake:1 (find_package)
[cmake]   CMakeLists.txt:95 (include)
[cmake] This warning is for project developers.  Use -Wno-dev to suppress it.
[cmake] 
[cmake] -- Generating test module
[cmake] -- Configuring done
[cmake] CMake Error at /home/lmp/vcpkg/scripts/buildsystems/vcpkg.cmake:623 (_add_library):
[cmake]   No SOURCES given to target: appcore
[cmake] Call Stack (most recent call first):
[cmake]   CMakeLists.txt:127 (add_library)
[cmake] 
[cmake] 
[cmake] CMake Error at /home/lmp/vcpkg/scripts/buildsystems/vcpkg.cmake:623 (_add_library):
[cmake]   No SOURCES given to target: appbin
[cmake] Call Stack (most recent call first):
[cmake]   CMakeLists.txt:127 (add_library)
[cmake] 
[cmake] 
[cmake] CMake Generate step failed.  Build files cannot be regenerated correctly.
[proc] The command: /home/lmp/.local/bin/cmake --no-warn-unused-cli -DCMAKE_TOOLCHAIN_FILE:STRING=/home/lmp/vcpkg/scripts/buildsystems/vcpkg.cmake -DBUILD_SHARED_LIBS:STRING=ON -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++ -S/home/lmp/gitlab/chatapp/server-auth -B/home/lmp/gitlab/chatapp/server-auth/build -G "Unix Makefiles" exited with code: 1 and signal: null

nó ghi warning “Protobuf” chữ P in hoa xem trong vcpkg.json có in hoa P gì ko :V với lại appbin appcore là cái gì :V chắc lỗi bên app của mình chứ :V

2 Likes

:v ko phải đâu mà, em bỏ cái library kia ra là nó build êm lắm, cái khúc đầu là warning th, có thể disable message nó đi. Cái cấu trúc em build thế này:

lib_proto (generated protobuf and grpc): build static library, public link với libproto và grpc 
|_ app_core (thư viện tái sử dụng cho nhiều service): build static library, public link với lib_proto, libsql..., và các lib khác.
|_ appbin (service demo implement grpc - gồm 1 static library cho service đó nữa, và 1 file main link đến thư viện đó nữa). 

Em sure kèo là app em build và chạy đc đc nếu bỏ cái library sql ra. Đây là file vcpkg.jsohn

{
  "name": "app",
  "version": "0.0.1",
  "dependencies": [
    {
      "name": "opentelemetry-cpp",
      "features": [
        "otlp"
      ]
    },
    "protobuf",
    "grpc",
    "boost-uuid",
    "fmt",
    {
      "name": "redis-plus-plus",
      "features": [
        "cxx17"
      ]
    },
    "mysql-connector-cpp",
    "gtest",
    "sqlpp11"
  ]
}
2 Likes

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

lạ vậy nó build thành công tất cả các thư viện dependencies à? Kể cả mysql-connector-cpp? Rồi tới khi build app thì mới fail?

xem cái cmakelists gì đấy lúc thêm cái mysql connector có copy paste mất dòng nào ko :V :V :V Sao lỗi nó là No SOURCES given to target: appcore là sao :V

lấy SOURCES bằng file GLOB gì hả? Bỏ nó đi add từng file .h .cpp thủ công bằng tay xem :V

# file(GLOB SOURCES ...) bỏ
# add_library(MyStaticLib STATIC ${SOURCES}) bỏ
add_library(MyStaticLib STATIC
  từng.h
  file.cpp 
  ở.cpp
  đây.h
  v.v...)

Sr anh, em đã đưa sai thông tin. Em xin phép đính chính lại các thông tin thế này ạ:

  1. Em build protocol buffer thành 1 project riêng và build source bằng bazel. Project cpp này em dùng external clone project proto về. Sau đó sử dụng cmake để build các file .pb.h, .pb.cc thành 1 library - gọi là library proto. (do hôm qua em nản quá định chuyển sang golang viết nên đã xóa các file generated này nên log báo là thiếu source, thành thật xin lỗi).
  2. Tất cả các object đều tạo make file thành công bằng lệnh: cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE={link to vcpkg}.
  3. Các target đều build thành công nhưng khi link library lại thì nó có vấn đề thế này:
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::MessageLite::LogInitializationErrorMessage() const':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:132: multiple definition of `google::protobuf::MessageLite::LogInitializationErrorMessage() const'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:133: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `std::iterator_traits<__gnu_cxx::__normal_iterator<std::pair<void (*)(void const*), void const*>*, std::vector<std::pair<void (*)(void const*), void const*>, std::allocator<std::pair<void (*)(void const*), void const*> > > > >::iterator_category std::__iterator_category<__gnu_cxx::__normal_iterator<std::pair<void (*)(void const*), void const*>*, std::vector<std::pair<void (*)(void const*), void const*>, std::allocator<std::pair<void (*)(void const*), void const*> > > > >(__gnu_cxx::__normal_iterator<std::pair<void (*)(void const*), void const*>*, std::vector<std::pair<void (*)(void const*), void const*>, std::allocator<std::pair<void (*)(void const*), void const*> > > > const&)':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:62: multiple definition of `google::protobuf::MessageLite::InitializationErrorString[abi:cxx11]() const'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:63: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::internal::ShutdownData::get()':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:66: multiple definition of `google::protobuf::MessageLite::DebugString[abi:cxx11]() const'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:67: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::MessageLite::MergeFromImpl(google::protobuf::io::CodedInputStream*, google::protobuf::MessageLite::ParseFlags)':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:217: multiple definition of `google::protobuf::MessageLite::MergeFromImpl(google::protobuf::io::CodedInputStream*, google::protobuf::MessageLite::ParseFlags)'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:218: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::MessageLite::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:241: multiple definition of `google::protobuf::MessageLite::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:242: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::MessageLite::MergeFromCodedStream(google::protobuf::io::CodedInputStream*)':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:245: multiple definition of `google::protobuf::MessageLite::MergeFromCodedStream(google::protobuf::io::CodedInputStream*)'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:246: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::MessageLite::ParseFromCodedStream(google::protobuf::io::CodedInputStream*)':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:249: multiple definition of `google::protobuf::MessageLite::ParseFromCodedStream(google::protobuf::io::CodedInputStream*)'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:250: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::MessageLite::ParsePartialFromCodedStream(google::protobuf::io::CodedInputStream*)':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:254: multiple definition of `google::protobuf::MessageLite::ParsePartialFromCodedStream(google::protobuf::io::CodedInputStream*)'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:255: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::MessageLite::ParseFromZeroCopyStream(google::protobuf::io::ZeroCopyInputStream*)':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:259: multiple definition of `google::protobuf::MessageLite::ParseFromZeroCopyStream(google::protobuf::io::ZeroCopyInputStream*)'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:260: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::MessageLite::ParsePartialFromZeroCopyStream(google::protobuf::io::ZeroCopyInputStream*)':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:264: multiple definition of `google::protobuf::MessageLite::ParsePartialFromZeroCopyStream(google::protobuf::io::ZeroCopyInputStream*)'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:265: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::MessageLite::ParseFromFileDescriptor(int)':
/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:268: multiple definition of `google::protobuf::MessageLite::ParseFromFileDescriptor(int)'; vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:269: first defined here
/usr/bin/ld: vcpkg_installed/x64-linux/debug/lib/libprotobufd.a(message_lite.cc.o): in function `google::protobuf::MessageLite::ParsePartialFromFileDescriptor(int)':
...

sao ko để vcpkg nó build hết :V

vd a thử 2 lib build = vcpkg hết nó build được mà :V

mysql-connector-cpp provides CMake targets:

    # this is heuristically generated, and may not be correct
    find_package(unofficial-mysql-connector-cpp CONFIG REQUIRED)
    target_link_libraries(main PRIVATE unofficial::mysql-connector-cpp::connector)

protobuf provides CMake targets:

    # this is heuristically generated, and may not be correct
    find_package(protobuf CONFIG REQUIRED)
    target_link_libraries(main PRIVATE protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite)
3 Likes

Nó build hết rồi á. Xong rồi em cd build && make thì nó ra lỗi link library ạ.
Nếu được thì anh có thể xem qua CMakeLists của em ạ.

cmake_minimum_required(VERSION 3.8)

project("metric")
if (COMMAND cmake_policy)
  cmake_policy(SET CMP0003 NEW)
  cmake_policy(SET CMP0008 NEW)
  cmake_policy(SET CMP0023 NEW)
endif()

macro(subdir_list result curdir)
  file(GLOB children RELATIVE ${curdir} ${curdir}/*)
  set(dirlist "")
  foreach(child ${children})
    if (IS_DIRECTORY ${curdir}/${child})
      list(APPEND dirlist ${child})
    endif()
  endforeach()

  set(${result} ${dirlist})
endmacro()

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/support/cmake)

if (NOT EMSCRIPTEN)
  include(TestBigEndian)
  test_big_endian(WORDS_BUGENDIAN)
endif()

if (NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Default build type is Debug.")
endif()

set(METRIC_DEBUG_MODE OFF)
set(METRIC_RUNTIME_CONFIG ${CMAKE_INSTALL_PREFIX}${CMAKE_INSTALL_DATAROOTDIR}/config/metricruntime.deploy.json)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  set(METRIC_DEBUG_MODE ON)
  set(METRIC_RUNTIME_CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/config/metricruntime.dev.json)
endif()

option(METRIC_PEDANTIC "Enable extra warning using standard language flags" ON)
option(METRIC_WERROR   "Halt compiler warnings into errors" ON)
option(METRIC_TEST     "Generate test target module when debug" ${METRIC_DEBUG_MODE})
option(METRIC_DOC      "Generate documentation module" OFF)

include(CheckCXXCompilerFlag)

if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  set(METRIC_PEDANTIC_FLAGS -pedantic -Wall -pedantic-errors -Werror
    -Wredundant-decls -Wwrite-strings -Wpointer-arith
    -Wcast-qual -Wformat=2 -Wmissing-include-dirs -Wcast-align
    -Wctor-dtor-privacy -Wdisabled-optimization
    -Winvalid-pch -Wconversion -Wundef
    -Wno-ctor-dtor-privacy -Wno-format-nonliteral)
  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6)
    set(METRIC_PEDANTIC_FLAGS ${METRIC_PEDANTIC_FLAGS}
      -Wno-dangling-else -Wno-unused-local-typedefs)
  endif()
  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
    set(METRIC_PEDANTIC_FLAGS ${METRIC_PEDANTIC_FLAGS}
      -Wtrampolines -Wzero-as-null-pointer-constant -Wuseless-cast
      -Wvector-operation-performance -Wsized-deallocation -Wshadow)
  endif()
  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0)
    set(METRIC_PEDANTIC_FLAGS ${METRIC_PEDANTIC_FLAGS} -Wshift-overflow=2
      -Wnull-dereference -Wduplicated-cond)
    check_cxx_compiler_flag(-Wzero-as-null-pointer-constant HAS_NULLPTR_WARNING)
    if (HAS_NULLPTR_WARNING)
      set(METRIC_PEDANTIC_FLAGS ${METRIC_PEDANTIC_FLAGS}
        -Wzero-as-null-pointer-constant)
    endif()
  endif()
  set(METRIC_WERROR_FLAGS -Werror)
endif()

if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  set(METRIC_PEDANTIC_FLAGS -Wall -Wextra -pedantic -Wconversion -Wundef
    -Wdeprecated -Wweak-vtables -Wshadow
    -Wno-gnu-zero-variadic-macro-arguments)
  set(METRIC_WERROR_FLAGS -Werror)
endif()

if (MSVC)
  set(METRIC_PEDANTIC_FLAGS /W3)
  set(METRIC_WERROR_FLAGS /WX)
endif()

include(ProvideBoost)
include(ProvideFmt)
include(ProvideGrpc)
include(ProvideMysqlConnectorCpp)
include(ProvideOpenTelemetry)
include(ProvideProtobuf)
include(ProvideRedis)
include(ProvideSqlpp)

include(GNUInstallDirs)
set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

set(proto_libs "")
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/config/metricbuild.dev.json MC_JSON)
string(JSON MC_PROTO_INSTRUCTION_JSON GET ${MC_JSON} proto_instruction)
string(JSON MC_PROTO_INSTRUCTION_JSON_SIZE LENGTH "${MC_PROTO_INSTRUCTION_JSON}")
math(EXPR MC_PROTO_INSTRUCTION_JSON_SIZE "${MC_PROTO_INSTRUCTION_JSON_SIZE} - 1")
foreach(IDX RANGE ${MC_PROTO_INSTRUCTION_JSON_SIZE})
  string(JSON CUR_PATH GET ${MC_PROTO_INSTRUCTION_JSON} ${IDX} path)
  string(JSON CUR_LIBNAME GET ${MC_PROTO_INSTRUCTION_JSON} ${IDX} libname)
  string(JSON CUR_HDR GET ${MC_PROTO_INSTRUCTION_JSON} ${IDX} hdr)
  string(JSON CUR_DEPS GET ${MC_PROTO_INSTRUCTION_JSON} ${IDX} deps)

  subdir_list(subdirs "${CMAKE_CURRENT_SOURCE_DIR}/${CUR_PATH}")

  set(CUR_PROTOLIB_CXX_SOURCES "")
  set(CUR_PROTOLIB_CXX_HDRS "")
  foreach(subdir ${subdirs})
    string(REGEX MATCH "([^_])(.*)" match_var ${subdir})
    if (NOT ${CMAKE_MATCH_1} MATCHES "_")
      file(GLOB_RECURSE TMP_PROTOLIB_CXX_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/${CUR_PATH}/${subdir}/*/*/*.cc")
      list(APPEND CUR_PROTOLIB_CXX_SOURCES ${TMP_PROTOLIB_CXX_SOURCES})
      list(APPEND CUR_PROTOLIB_CXX_HDRS "${CMAKE_CURRENT_SOURCE_DIR}/${CUR_PATH}/${subdir}")
    endif()
  endforeach()

  add_library(${CUR_LIBNAME} STATIC ${CUR_PROTOLIB_CXX_SOURCES})

  foreach(cur_protolib_cxx_hdr ${CUR_PROTOLIB_CXX_HDRS})
    target_include_directories(${CUR_LIBNAME} PUBLIC "$<BUILD_INTERFACE:${cur_protolib_cxx_hdr}>")
  endforeach()
  
  target_include_directories(${CUR_LIBNAME} PUBLIC "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")

  target_link_libraries(${CUR_LIBNAME} PUBLIC LibProtobuf)
  target_link_libraries(${CUR_LIBNAME} PUBLIC LibGrpcGrpc)
  target_link_libraries(${CUR_LIBNAME} PUBLIC LibGrpcGrpcpp)
  target_link_libraries(${CUR_LIBNAME} PUBLIC LibGrpcGrpcppReflection)

  string(JSON deps_size LENGTH "${CUR_DEPS}")
  math(EXPR deps_size "${deps_size} - 1")
  if (deps_size GREATER -1)
    foreach(dep_idx RANGE ${deps_size})
      string(JSON dep GET ${CUR_DEPS} ${dep_idx})
      target_link_libraries(${CUR_LIBNAME} PUBLIC ${dep})
    endforeach()
  endif()

  list(APPEND proto_libs ${CUR_LIBNAME})
endforeach()

file(GLOB_RECURSE METRIC_CXX_SOURCES "src/metric/core/*.cpp" "src/metric/core/*/*.cpp")

add_library(metriccore STATIC ${METRIC_CXX_SOURCES})

target_include_directories(metriccore PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
target_include_directories(metriccore PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>)

target_link_libraries(metriccore PUBLIC LibMysqlConnector)
target_link_libraries(metriccore PUBLIC LibOpentelemetryOtlpGrpcExporter)
target_link_libraries(metriccore PUBLIC LibFmt)
target_link_libraries(metriccore PUBLIC LibBoostBoost)
target_link_libraries(metriccore PUBLIC LibSqlpp11)

foreach(proto_lib ${proto_libs})
  target_link_libraries(metriccore PUBLIC ${proto_lib})
endforeach()

if (METRIC_PEDANTIC)
  target_compile_options(metriccore PUBLIC ${METRIC_PEDANTIC_FLAGS})
endif()
if (METRIC_WERROR)
  target_compile_options(metriccore PUBLIC ${METRIC_WERROR_FLAGS})
endif()
if (METRIC_DEBUG_MODE)
  target_compile_definitions(metriccore PUBLIC METRIC_DEBUG)
endif()

string(JSON MC_METRIC_BUILD_JSON GET ${MC_JSON} metric_build)
string(JSON MC_METRIC_BUILD_JSON_SIZE LENGTH "${MC_METRIC_BUILD_JSON}")
math(EXPR MC_METRIC_BUILD_JSON_SIZE "${MC_METRIC_BUILD_JSON_SIZE} - 1")
foreach(IDX RANGE ${MC_METRIC_BUILD_JSON_SIZE})
  string(JSON CUR_METRIC_BUILD_NAME GET ${MC_METRIC_BUILD_JSON} ${IDX} name)
  file(GLOB_RECURSE CUR_METRIC_BUILD_CXX_SOURCES "src/metric/${CUR_METRIC_BUILD_NAME}/*/*.cpp" "src/metric/${CUR_METRIC_BUILD_NAME}/*/*/*.cpp")

  add_library(${CUR_METRIC_BUILD_NAME} STATIC ${CUR_METRIC_BUILD_CXX_SOURCES})
  target_link_libraries(${CUR_METRIC_BUILD_NAME} PUBLIC metriccore)

  string(JSON CUR_USE_REDIS GET ${MC_METRIC_BUILD_JSON} ${IDX} deps use_redis)
  if (CUR_USE_REDIS STREQUAL "ON")
    target_link_libraries(${CUR_METRIC_BUILD_NAME} PUBLIC LibRedisPlusPlus)
  endif()

  set(CUR_METRIC_BUILD_BIN ${CUR_METRIC_BUILD_NAME}_app)
  add_executable(${CUR_METRIC_BUILD_BIN} ${CMAKE_CURRENT_SOURCE_DIR}/src/metric/${CUR_METRIC_BUILD_NAME}/main.cpp)
  target_link_libraries(${CUR_METRIC_BUILD_BIN} PRIVATE ${CUR_METRIC_BUILD_NAME})
endforeach()

configure_file(define.h.cmake define.h)

install(
  TARGETS metriccore
  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(
  DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/config
  DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}
  FILES_MATCHING PATTERN "*.deploy.yaml"
)

if (METRIC_TEST)
  message(STATUS "Generating test module")
  enable_testing()
  add_subdirectory(test)
endif()

if (METRIC_DOC)
  add_subdirectory(doc)
endif()

vậy cái này là sao a ko hiểu :V sao build protobuf = vcpkg rồi lại build = bazel nữa?

1 Like

Cái này em bắt chước làm theo https://github.com/googleapis/googleapis á. Nhưng đại khái là thay vì dùng command protoc -I ...., nó không phù hợp để structure project phức tạp hơn, nên bazel giúp quản lý cái này, sau đó chạy lệnh bazel build //... thì nó sẽ generate ra các file .pb.h, .pb.cc:

Sau đó em viết 1 hàm custom bằng cmake để loop qua tất cả các file này và build ra thành 1 thư viện proto ạ.
Em kết hợp 2 cái là do, protobuf thì build bằng bazel mới đc, còn viết c++ lại phải dùng cmake kết hợp với vcpkg mới được.

/home/balebom/vcpkg/buildtrees/protobuf/src/v3.21.8-b162a26f57.clean/src/google/protobuf/message_lite.cc:132: multiple definition of `google::protobuf::MessageLite::LogInitializationErrorMessage() const'; 
vcpkg_installed/x64-linux/debug/lib/libmysqlcppconn8-static.a(libprotobuf-lited_message_lite.cc.o):
/home/balebom/vcpkg/buildtrees/mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc:133: first defined here

vậy chắc là mấy cái file generate ra nó viết lại cái hàm như google::protobuf::MessageLite::LogInitializationErrorMessage() em vào xem xóa thử mấy cái đó xem :V hay xem protoc có option nào loại mấy cái hàm này ra

edit: chắc là phải run protoc -I path/to/projct/root

The protocol compiler searches for imported files in a set of directories specified on the protocol compiler command line using the -I / --proto_path flag. If no flag was given, it looks in the directory in which the compiler was invoked. In general you should set the --proto_path flag to the root of your project and use fully qualified names for all imports.

như hiện tại nó build ra ở path mysql-connector-cpp/x64-linux-dbg/cdk/protocol/mysqlx/protobuf/./protobuf-3.19.4/src/google/protobuf/message_lite.cc đâu có đúng :V :V Mỗi file .cc lại có -I path khác nhau nên nó lại định nghĩa lại mấy hàm kia nên dẫn tới lỗi multiple definitions

3 Likes

Nhưng khi build lại protobuf files thì em đã link nó qua LibProtobuf (latest proto on vcpkg). Còn cái lib mysql nó dùng phiên bản cũ hơn á anh. Dù gì đi nữa, link cả 2 thư viện lại 1 lúc thì nó lại bị conflict của 2 protobuf. Còn việc build protoc em đã dùng bazel, cho dù bazel sử dụng khác phiên bản protoc thì nó cũng ko ảnh hưởng do vẫn sử dụng cùng major version chứ ạ.
Vậy làm sao để link 2 library mà nó ko bị overlap nhau được.

em đọc lại doc của protobuf :V
https://developers.google.com/protocol-buffers/docs/cpptutorial

xài con protoc trong build\<..>\vcpkg_installed\x64-linux\tools\protobuf ấy :V

rồi ví dụ gọi đúng 1 SRC_DIR và 1 DST_DIR thôi :V

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto

mang ông google xài cái bazel vào cmake loạn hết cả lên :weary:

2 Likes

generate thế nào mà cmake nó lại thông báo có compile cả file .cc ở vcpkg/buildtrees (ko thuộc project của mình) vậy nè. Chắc là chạy protoc gì dư rồi, rồi e glob mấy cái file dư này :V :V


edit: ủa của a bên windows thằng mysql-connector cũng có protobuf :cold_face:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?