Как включить заголовочные файлы во внешнюю библиотеку в CMake - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть приложение C, которое работает на Raspberry Pi 3, и в настоящее время я должен построить его на PI с помощью Cmake.Я пытаюсь собрать его на машине с Ubuntu.Я добавил CMAKE_TOOLCHAIN_FILE, как описано здесь .Я мог запустить cmake. -DCMAKE_TOOLCHAIN_FILE без проблем, но команда «make» не удалась, и она не может найти файл заголовка внутри одной из внешних библиотек: «mirsdrapi-rsp».Сообщение об ошибке:

fatal error: mirsdrapi-rsp.h: No such file or directory
 #include "mirsdrapi-rsp.h"
                           ^
compilation terminated.

Я создал папку с именем "lib" и поместил в нее файл "libmirsdrapi-rsp.so".Мой CMakeLists.txt выглядит следующим образом:

cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -pedantic -Wextra -v -g -D_XOPEN_SOURCE")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Wextra -v ")
set(CMAKE_EXE_LINKER_FLAGS  ${CMAKE_EXE_LINKER_FLAGS} "-v")
set (SDR_API_PATH ${CMAKE_SOURCE_DIR}/lib)
include_directories (include ${SDR_API_PATH})

include_directories("${CMAKE_SOURCE_DIR}/lib")

find_library(mirslocation NAMES mirsdrapi-rsp HINTS ${SDR_API_PATH} NO_CMAKE_FIND_ROOT_PATH)
message(STATUS ${mirslocation})

add_library(mirs STATIC IMPORTED)
set_target_properties(mirs PROPERTIES IMPORTED_LOCATION ${mirslocation})

target_link_libraries (raspberryPiDaemon mirs)
target_link_libraries(raspberryPiDaemon m)

Cmake печатает правильный путь к библиотеке mirsdrapi-rsp при запуске «find_library», и, как я уже говорил, я получаю сообщение об ошибке только при запуске «make»команда, а не команда "cmake".Мое содержимое CMAKE_TOOLCHAIN_FILE выглядит следующим образом:

# Define our host system
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)

# Define the cross compiler locations
SET(CMAKE_C_COMPILER   ${CMAKE_SOURCE_DIR}/../tools-master/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER ${CMAKE_SOURCE_DIR}/../tools-master/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)

# Define the sysroot path for the RaspberryPi distribution in our tools folder 
SET(CMAKE_FIND_ROOT_PATH ${CMAKE_SOURCE_DIR}/../tools-master/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf/sysroot/SET)


# Use our definitions for compiler tools
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# Search for libraries and headers in the target directories only
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)

add_definitions(-Wall -std=c11)

Кто-нибудь знает, как я могу добавить файл заголовка из библиотеки mirsdrapi-rsp, чтобы включить путь?

1 Ответ

0 голосов
/ 14 сентября 2018

Я предполагаю, что вы устанавливаете include_directories по неверному пути (он 2 раза устанавливается в $ {CMAKE_SOURCE_DIR} / lib, который должен быть папкой библиотек, а не заголовочных файлов).Проверьте еще раз правильное местоположение отсутствующего заголовочного файла.

Точнее: вам нужно найти путь к mirsdrapi-rsp.h и сообщить об этом CMake так же, как и для find_library:

find_path(MIRSDRAPI_INCLUDE_DIRS NAMES mirsdrapi-rsp.h PATHS {proper-location})

if (MIRSDRAPI_INCLUDE_DIRS)
  target_include_directories(raspberryPiDaemon PRIVATE ${MIRSDRAPI_INCLUDE_DIRS})
endif()

Кроме того, вы можете установить свойство INTERFACE_INCLUDE_DIRECTORIES дляподобная библиотека:

set_property(TARGET mirsdrapi-rsp APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MIRSDRAPI_INCLUDE_DIRS})

Таким образом, target_include_directories могут быть ненужными, и target_link_directories должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...