c - 如何在CMake的外部库中包含头文件

标签 c build cmake raspberry-pi

我有一个在 Raspberry Pi 3 上运行的 C 应用程序,目前,我必须使用 Cmake 在 PI 上构建它。我正在尝试在 Ubuntu 机器上构建它。我已经按照描述添加了 CMAKE_TOOLCHAIN_FILE here 。 我可以运行 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 在运行“find_library”时打印库 mirsdrapi-rsp 的正确路径,正如我提到的,我在运行“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 库中的头文件添加到包含路径吗?

最佳答案

我猜您将 include_directories 设置为错误的路径(它被设置了两次 ${C​​MAKE_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 就足够了。

关于c - 如何在CMake的外部库中包含头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52332809/

相关文章:

c++ - 有没有办法强制 Windows 在套接字调用上产生短读/写?

opencv - 如何在 ubuntu 10.4 中开始使用 OpenCV 2.4.2?

android - Gradle DSL 方法未找到 : "classpath()"

c++ - 生成MITK教程错误

c++ - QtCreator Cmake C++17 功能

限制在 NVIDIA Jetson TX2 上运行 GStreamer 的协商问题

c - openSSL:如何创建 CA 文件

c++ - 使用 make 有条件地设置调试宏

c++ - 如何使用 CMake 应用 llvm passes

c - 生成一个从0到10000000的随机数