#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}")
Комментариев нет:
Отправить комментарий