Как прилинковать нестандартную версию protobuf используя cmake

191
25 августа 2018, 06:30

Есть проект под arm который компилируется и собирается на х86ой машине (кросскомпиляция). Есть версия библиотеки protobuf собранная под arm по этой инструкции. В cmake файле я пытаюсь явно указать местоположение собранной под arm библиотеки через переменную Protobuf_SRC_ROOT_FOLDER но похоже что cmake эта переменная вообще побоку. Что мне сделать что бы find_package(Protobuf REQUIRED) нашёл ту версию protobuf которая мне нужна?

cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall -pthread ") #-lboost_system
project(proto_test)
# Подключаем протобуф 
set (Protobuf_SRC_ROOT_FOLDER "/home/mrfieldy/prot_build/protobuf-3.5.1-arm/src")  
#set (Protobuf_USE_STATIC_LIBS ON)   
find_package(Protobuf REQUIRED)
include_directories(${PROTOBUF_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS test.proto)
add_executable(${PROJECT_NAME} test.pb.cc ${PROTO_SRCS} ${PROTO_HDRS} "main.cpp")
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})

Ответ:

В общем, как посоветовали ниже, я выбрал путь сначала выполнить find_package, а потом с помошью set переопределить пути. Долго искал на какие пути надо переопределить. Вот рабочий вариант.

cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall -pthread ")
project(proto_test)
# Подключаем протобуф 
find_package(Protobuf REQUIRED)
set (PROTOBUF_INCLUDE_DIRS "/home/mrfieldy/prot_build/protobuf-3.6.0-arm/src/")
set (PROTOBUF_LIBRARIES "/home/mrfieldy/prot_build/protobuf-3.6.0-arm/src/.libs/libprotobuf.so")
include_directories(${PROTOBUF_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
#protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS test.proto)
add_executable(${PROJECT_NAME} test.pb.cc ${PROTO_SRCS} ${PROTO_HDRS} "main.cpp")
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})
Answer 1

Поискал по переменной Protobuf_SRC_ROOT_FOLDER и нашел вот что:

FindProtobuf

К сожалению мой английский sehr schlecht, но, насколько я понял у вас версия cmake слишком низкая (документация там начинается с 3.02), а сама переменная касается лишь определенного случая, касающегося Visual Studio и, что-то мне подсказывает, это не то, что вы используете.

Посоветую написать Find-файл самому - это довольно просто

Answer 2

У нас похожая ситуация, только QtCreator. Может поможет. Это переменные конфигурации CMake

А это toolchain (если собирать не в QtCreator, а в консоли):

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(buildrootdir /home/vegorov/Build-Root/04.06.2018/BR-opo)
set(buildtriplet arm-buildroot-linux-gnueabihf)
set(CMAKE_SYSROOT ${buildrootdir}/output/host/${buildtriplet}/sysroot)
set(CMAKE_STAGING_PREFIX ${buildroot}/output/spo-stage)
set(tools ${buildrootdir}/output/host/)
set(CMAKE_C_COMPILER ${tools}/bin/${buildtriplet}-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/${buildtriplet}-g++)
set(PROTOBUF_PROTOC_EXECUTABLE "${tools}bin/protoc")
set(CMAKE_PREFIX_PATH ${buildrootdir}/output/host/${buildtriplet}/sysroot/usr/lib/cmake)
set(OE_QMAKE_PATH_EXTERNAL_HOST_BINS ${tools}/bin/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(COMPILER_FLAGS "--sysroot=${CMAKE_SYSROOT} -O2 -march=armv7-a -marm -mfpu=vfpv3-d16 -mfloat-abi=hard -mcpu=cortex-a9")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS}" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS}" CACHE STRING "" FORCE)
#set(envpath $ENV{PATH})
#set(ENV{PATH} "${tools}bin:${envpath}" )
#message(STATUS ":${tools}bin:${envpath}")
READ ALSO
Не мапится объект из POST запроса

Не мапится объект из POST запроса

Моя задача состоит в том, чтобы создать post запрос, получить из него объект Item и сохранить его в базу данных OracleДля эмуляции запроса я использую...

352
File is read-only. Правка файла в библиотеке мавена

File is read-only. Правка файла в библиотеке мавена

Процесс отладки показывает, что вызов с фронта обрабатывается классами из external libraries в maven

183
автоматизация java selenium webdriver

автоматизация java selenium webdriver

после запуска, открывается страница с хромом, в поле куда должны вписываться символы отget(), написано "data:,"

291
Для чего нужен tools.jar?

Для чего нужен tools.jar?

Разбирая пример написания класса Pair, столкнулся с тем, что такой класс уже реализован как comsun

199