不确定如何处理来自 pigpio 的 CMake 文件
Unsure what to do with the CMake file from pigpio
我是 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)
I mkdir _build
、cd _build
和 cmake ..
,这给出了非常有希望的输出:
-- 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)
我其实并不特别了解pigpio。但是从纯粹的 cmake 角度来看,您需要引入 pigpio CMakeLists.txt 并将该库添加为 link 依赖项。 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)
我发布了我自己问题的答案,以防其他人像我一样误入歧途。在创建 makefile 方面,我应该更多地考虑 CMake。如果您不经常这样做,并且正在尝试学习 CMake,我建议您先尝试为您的示例项目整理一个手动生成文件,然后再完成整个过程。我不确定为什么我要尝试学习 CMake,就好像它与 makefile 没有任何联系...没有用。
@kaylum 的回答是正确的,但我还遗漏了其他一些东西。对于初学者来说,将 pigpio 克隆到项目的文件结构中没有意义 - 我已经安装了它并且可以 link 它作为目标库。同样,即使我让它在构建时尝试(不必要地)构建 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)
我是 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)
I mkdir _build
、cd _build
和 cmake ..
,这给出了非常有希望的输出:
-- 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)
我其实并不特别了解pigpio。但是从纯粹的 cmake 角度来看,您需要引入 pigpio CMakeLists.txt 并将该库添加为 link 依赖项。 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)
我发布了我自己问题的答案,以防其他人像我一样误入歧途。在创建 makefile 方面,我应该更多地考虑 CMake。如果您不经常这样做,并且正在尝试学习 CMake,我建议您先尝试为您的示例项目整理一个手动生成文件,然后再完成整个过程。我不确定为什么我要尝试学习 CMake,就好像它与 makefile 没有任何联系...没有用。
@kaylum 的回答是正确的,但我还遗漏了其他一些东西。对于初学者来说,将 pigpio 克隆到项目的文件结构中没有意义 - 我已经安装了它并且可以 link 它作为目标库。同样,即使我让它在构建时尝试(不必要地)构建 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)