【问题标题】:Unsure what to do with the CMake file from pigpio不确定如何处理来自 pigpio 的 CMake 文件
【发布时间】:2021-12-13 23:58:38
【问题描述】:

我是 CMake 的新手,希望使用一个非常简单的 Raspberry Pi 应用程序作为学习体验。我在一个简单的目录结构中有几个文件,而且我正在使用pigpio。我的代码本身编译得很好,但是当我使用 CMake 生成 makefile 时,makefile 在 pigpio 中找不到引用。 pigpio 在util 目录中包含一个文件Findpigpio.cmake,因此我尝试将其包含在CMakeLists.txt 中,但无济于事。

文件结构:

RPapp
├──inc/
|   ├──spi.h
|   └──gpio.h
├──src/
|   ├──spi.c
|   ├──gpio.c
|   └──main.c
├──pigpio/
|   ├──util/
|   |   ├──Findpigpio.cmake
|   |   └──[whatever else is in here]
|   └──[remainder of code cloned from github]
└──CMakeLists.txt

这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(RPapp C)
include(pigpio/util/Findpigpio.cmake)
include_directories(inc)
set(CMAKE_C_STANDARD 11)
add_executable(RPapp ${PROJECT_SOURCE_DIR}/src/main.c ${PROJECT_SOURCE_DIR}/src/gpio.c ${PROJECT_SOURCE_DIR}/src/spi.c)

mkdir _buildcd _buildcmake ..,这给出了非常有希望的输出:

-- The C compiler identification is GNU 8.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Found pigpio: /usr/local/include
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/RPapp/_build

但是当我运行make时,输出显示它无法引用pigpio的函数:

Scanning dependencies of target RPapp
[ 25%] Building C object CMakeFiles/RPapp.dir/src/main.c.o
[ 50%] Building C object CMakeFiles/RPapp.dir/src/gpio.c.o
[ 75%] Building C object CMakeFiles/RPapp.dir/src/spi.c.o
[100%] Linking C executable RPapp
/usr/bin/ld: CMakeFiles/RPapp.dir/src/main.c.o: in function `main':
main.c:(.text+0x38): undefined reference to `gpioTerminate'
/usr/bin/ld: CMakeFiles/RPapp.dir/src/main.c.o: in function `buff_rdy_handler':
main.c:(.text+0x88): undefined reference to `spiRead'
...(more of the same)

【问题讨论】:

    标签: c cmake raspberry-pi pigpio


    【解决方案1】:

    我实际上并不具体了解 pigpio。但是从纯粹的 cmake 角度来看,您需要引入 pigpio CMakeLists.txt 并将该库添加为链接依赖项。 include(pigpio/util/Findpigpio.cmake) 是不必要的。

    cmake_minimum_required(VERSION 3.0.0)
    project(RPapp C)
    # removed  following line
    #include(pigpio/util/Findpigpio.cmake)
    include_directories(inc)
    set(CMAKE_C_STANDARD 11)
    add_executable(RPapp ${PROJECT_SOURCE_DIR}/src/main.c ${PROJECT_SOURCE_DIR}/src/gpio.c ${PROJECT_SOURCE_DIR}/src/spi.c)
    
    # added these lines
    add_subdirectory(pigpio)
    target_link_libraries(RPapp pigpio)
    

    【讨论】:

    • 根据 pigpio 的CMakeLists.txt,目标 pigpio 没有附带包含目录(带有target_include_directories)。所以他们应该手动包含在主CMakeLists.txt:include_directories(pigpio)中。
    • @Tsyvarev 你能帮我看看你在那个文件中看到这个吗?我没有看到您是如何发现这一点的:-/ 同样,您能否举例说明“它们应该包含在主要的CMakeLists.txt”中是什么意思?你的意思是我需要一堆像include_directories(pigpio/command.h pigpio/pigpio.h ...) 这样的行?对不起,如果这些问题很简单,但我现在真的在 CMake 范式上苦苦挣扎。
    • @TrivialCase:你知道包含目录对于编译器意味着什么吗?该术语不是特定于 CMake 的,但适用于每个 C 和 C++ 编译器。在我之前的评论中,我的意思是写的内容:include_directories(pigpio).
    • 啊抱歉,是的,但是您说“他们”应该被包括在内,并且只列出了顶级目录 - 我假设多个评论表明您遗漏了一些不明显的东西对我来说。当您说“根据 pigpio 的 CMakeLists”时,您只是表示您看到该文件中缺少一些指令,因此您推断该行是必要的?不是pigpioCMakeLists专门说是这样的吧?
    • @kaylum 看起来这成功了——或者更确切地说,现在我对pthread 函数有未定义的引用,但我想我也需要克隆该项目并尝试找出类似的魔法.但是,现在我比以往任何时候都更加困惑 .cmake 文件应该做什么以及为什么要包含它。
    【解决方案2】:

    我正在发布我自己问题的答案,以防其他人像我一样被误导。我应该在创建 makefile 方面更多地考虑 CMake。如果您不经常这样做,并且正在尝试学习 CMake,我建议您先尝试为您的示例项目编写一个手动 makefile,然后再完成整个过程。我不知道我为什么要尝试学习 CMake,就好像它与 makefile 没有任何联系……没用。

    @kaylum 的回答是正确的,但我还遗漏了其他一些东西。对于初学者来说,将 pigpio 克隆到项目的文件结构中是没有意义的——我已经安装了它,并且可以将它作为库链接到目标。同样,即使我在构建时尝试(不必要地)构建 pigpio,我仍然缺少一些依赖项。无论如何,这是一种可能的简单 CMakeLists.txt 文件,它可以完成我想做的工作:

    # RPapp/CMakeLists.txt
    cmake_minimum_required(VERSION 3.16)
    project(RPapp C)
    
    find_package(Threads)
    
    include_directories(inc)
    
    set(CMAKE_C_STANDARD 11)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O2")
    
    add_executable(RPapp ${PROJECT_SOURCE_DIR}/src/main.c ${PROJECT_SOURCE_DIR}/src/gpio.c ${PROJECT_SOURCE_DIR}/src/spi.c)
    
    target_link_libraries(RPapp pigpio rt)
    
    install(TARGETS RPapp DESTINATION bin)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-07
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 2019-09-12
      • 2013-04-01
      相关资源
      最近更新 更多