在RaspberryPi上添加wiringPi lib到cmake

Sky*_*igh 1 c++ cmake raspberry-pi

对于我在c ++中的项目,我想创建一个cmake文件来编译并将所有内容链接在一起.
到目前为止这是我的目录结构:

"quadro/minimu9-ahrs" alias home
|-build
|-include
|-src
Run Code Online (Sandbox Code Playgroud)

在我的家里,我有这个'CMakeLists.txt'文件:

cmake_minimum_required (VERSION 2.6)
project(minimu)

set(HEADER_FILES $("include/*.h")
include_directories(include)
file(GLOB SOURCES "src/*.cpp")

add_executable(minimu ${SOURCES})
add_definitions(-std=c++0x -lwiringPi -lpthread)

#install(TARGETS minimu DESTINATION /usr/lib)
Run Code Online (Sandbox Code Playgroud)

在我的'src'目录中,我获得了所有.cpp文件,并且在'include'中包含了所有标题.当我正在编辑时,我进入我的构建目录,删除那里存在的所有内容(来自之前的版本)并输入

cmake ..
make
Run Code Online (Sandbox Code Playgroud)

我现在的问题是,src中的main.cpp使用'#include wiringPi.h',但是当我创建项目时,它给出了以下错误:

pi@raspberrypi ~/quadro/minimu9-ahrs/build $ make
Scanning dependencies of target minimu
[ 20%] Building CXX object CMakeFiles/minimu.dir/src/L3G.cpp.o
[ 40%] Building CXX object CMakeFiles/minimu.dir/src/LSM303.cpp.o
[ 60%] Building CXX object CMakeFiles/minimu.dir/src/main.cpp.o
[ 80%] Building CXX object CMakeFiles/minimu.dir/src/I2CBus.cpp.o
[100%] Building CXX object CMakeFiles/minimu.dir/src/MinIMU9.cpp.o
Linking CXX executable minimu
CMakeFiles/minimu.dir/src/main.cpp.o: In function `frequency_thread(void*)':
main.cpp:(.text+0x1c): undefined reference to `digitalWrite'
main.cpp:(.text+0x38): undefined reference to `digitalWrite'
CMakeFiles/minimu.dir/src/main.cpp.o: In function `signalHandler(int)':
main.cpp:(.text+0xd4): undefined reference to `digitalWrite'
main.cpp:(.text+0xe8): undefined reference to `digitalWrite'
CMakeFiles/minimu.dir/src/main.cpp.o: In function `main':
main.cpp:(.text+0x14c): undefined reference to `wiringPiSetup'
main.cpp:(.text+0x184): undefined reference to `pinMode'
main.cpp:(.text+0x1e8): undefined reference to `pthread_create'
main.cpp:(.text+0x29c): undefined reference to `pthread_join'
collect2: ld returned 1 exit status
CMakeFiles/minimu.dir/build.make:185: recipe for target 'minimu' failed
make[2]: *** [minimu] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/minimu.dir/all' failed
make[1]: *** [CMakeFiles/minimu.dir/all] Error 2
Makefile:72: recipe for target 'all' failed
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)

那么如何在cmake中告诉编译器在哪里找到以及如何使用wiringPi lib?是否有更简单的方法,而不是在cmaking之前删除我的构建文件夹中的所有内容?就像它一次编译所有'静态'文件一样,每次只添加更改文件(= main.cpp).

此外,我想在各处执行我的程序

sudo minimu
Run Code Online (Sandbox Code Playgroud)

而不是进入'构建'目录并键入

sudo ./minimu
Run Code Online (Sandbox Code Playgroud)

谢谢,如果你能帮助我们!
抱歉,如果我的英语不是那么好:)
祝你有愉快的一天.

小智 6

我今天才想到这一点,感谢塞巴斯蒂安在github.

假设您已安装wiringPi,最简单的方法是使用以下内容创建FindWiringPi.cmake:

find_library(WIRINGPI_LIBRARIES NAMES wiringPi)
find_path(WIRINGPI_INCLUDE_DIRS NAMES wiringPi.h)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(wiringPi DEFAULT_MSG WIRINGPI_LIBRARIES WIRINGPI_INCLUDE_DIRS)
Run Code Online (Sandbox Code Playgroud)

然后把它放在cmake查找它的模块的文件夹中.对于Ubuntu,它是/usr/share/cmake-2.x/Modules.pi也基本上是相同的路径.

然后在您的CMakeLists.txt文件中使用:

# Locate libraries and headers
find_package(WiringPi REQUIRED)
find_package(Threads REQUIRED) 

# Include headers
include_directories(${WIRINGPI_INCLUDE_DIRS}) 

# Link against libraries
target_link_libraries(<yourProjectName> ${WIRINGPI_LIBRARIES}) 
target_link_libraries(<yourProjectName> ${CMAKE_THREAD_LIBS_INIT}) 
Run Code Online (Sandbox Code Playgroud)

pthread模块是一个库存包,应该已经在您的系统上.因此,然后导航到您的文件夹,并做了cmake ./,然后make.如果这在第一次不起作用,请删除您的CMakeCache.txt,rm CMakeCache.txt然后重试.请确认你删除了缓存而不是列表!!


小智 6

感谢您的 QA,我发现这可以通过更简单的方式(Raspberry Pi 3 Model B+)完成,而无需更改/usr/share/cmake-x.y/Modules. 在您的add_executable行之后添加以下内容

find_library(WIRINGPI_LIBRARIES NAMES wiringPi)
target_link_libraries(<executable_name> ${WIRINGPI_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

例如:

cmake_minimum_required(VERSION 3.5)
project(OpenInsulin)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_VERBOSE_MAKEFILE ON)

# Include headers
include_directories(.)

add_executable(OpenInsulin
        main.cpp
        MCP9600.cpp
        MCP9600.h)

# Link against wiringPi
find_library(WIRINGPI_LIBRARIES NAMES wiringPi)
target_link_libraries(OpenInsulin ${WIRINGPI_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)


Pet*_*fer 1

为编译器标志提供一个标志-L <path>

add_definitions(-std=c++0x -L/path/to/libwringPi.???.(so|a) -lwiringPi -lpthread)
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么你在运行 cmake 之前清除构建目录(这不是批评。我真的不明白,可能有一个我不知道的原因)。make 检查源是否比上次编译输出更新,并仅编译受影响的文件。但这仅在不删除构建目标的情况下有效。

要安装生成的程序,请取消注释 cmake 中的安装指令并设置 PATH 中的目标目录。您还可以创建一个目录 /home//bin 等。将其添加到 PATH 环境变量中,并使用新路径配置安装指令的目标。然后,除了cmakemake您还必须执行make install.