首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不确定如何处理来自pigpio的CMake文件

不确定如何处理来自pigpio的CMake文件
EN

Stack Overflow用户
提问于 2021-10-28 19:34:35
回答 2查看 82关注 0票数 0

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

文件结构:

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
-- 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中的函数:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-28 19:47:04

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

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2021-10-29 18:24:45

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

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

代码语言:javascript
复制
# 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69759904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档