在RaspberryPi上添加wiringPi lib到cmake

时间:2015-05-24 13:47:33

标签: c++ cmake raspberry-pi

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

"quadro/minimu9-ahrs" alias home
|-build
|-include
|-src

在我的家里,我有这个'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)

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

cmake ..
make

我现在的问题是,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

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

此外,我希望像

一样执行我的程序
sudo minimu

而不是进入'build'目录并输入

sudo ./minimu

谢谢,如果你能帮助我们的话! 对不起,如果我的英语不是那么好:) 祝你有愉快的一天。

3 个答案:

答案 0 :(得分: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)

然后把它放在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}) 

pthread模块是一个库存包,应该已经在您的系统上。然后导航到您的文件夹并执行cmake ./,然后make。如果第一次没有这项功能,请使用rm CMakeCache.txt删除您的CMakeCache.txt,然后重试。请确认你删除了CACHE而不是列表!!

答案 1 :(得分:0)

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

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

我不明白,为什么你在运行cmake之前清除build dir(这不是批评。我真的不明白,可能有一个我不知道的原因)。检查源是否比最后一个编译输出更新,并仅编译受影响的文件。但这只是工作,如果不删除构建目标。

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

答案 2 :(得分:0)

感谢质量检查人员,我发现可以以更简单的方式(Raspberry Pi 3 B +型)完成此操作,而无需更改/usr/share/cmake-x.y/Modules中的任何内容。在您的add_executable行之后,添加以下内容

find_library(WIRINGPI_LIBRARIES NAMES wiringPi)
target_link_libraries(<executable_name> ${WIRINGPI_LIBRARIES})

例如:

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})