Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

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

#cpp #cmake #protobuf #кросс_компиляция #линковка


Есть проект под 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})

    


Ответы

Ответ 1



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

Ответ 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}")

Комментариев нет:

Отправить комментарий