我是 CMake 的新手,希望使用一個非常簡單的 Raspberry Pi 應用程式作為學習經驗。我在一個簡單的目錄結構中有幾個檔案,另外我正在使用pigpio。我的代碼自己編譯得很好,但是當我使用 CMake 生成 makefile 時,makefile 找不到 pigpio 中的參考。pigpioFindpigpio.cmake在util目錄中包含一個檔案 ,因此我嘗試將其包含在 中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)
uj5u.com熱心網友回復:
我實際上并不特別了解 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)
uj5u.com熱心網友回復:
我正在發布我自己問題的答案,以防其他人和我一樣被誤導。我應該在創建 makefile 方面更多地考慮 CMake。如果您不經常這樣做,并且正在嘗試學習 CMake,我建議您首先嘗試為您的示例專案組合一個手動生成檔案,然后再完成整個程序。我不知道為什么我試圖學習 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341534.html
