【问题标题】:Add wiringPi lib to cmake on RaspberryPi在 RaspberryPi 上将 WiringPi 库添加到 cmake
【发布时间】:2015-08-06 02:26:51
【问题描述】:

对于我的 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?有没有更简单的方法,而不是在创建之前删除我的构建文件夹中的所有内容?就像它一次编译所有“静态”文件,每次只添加更改文件(=main.cpp)。

此外,我想在任何地方执行我的程序,例如

sudo minimu

而不是进入“构建”目录并输入

sudo ./minimu

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

【问题讨论】:

    标签: c++ cmake raspberry-pi


    【解决方案1】:

    感谢 github 上的 Sebastian,我今天才知道这一点。

    假设你已经安装了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 并重试。确保您删除了缓存而不是列表!!

    【讨论】:

      【解决方案2】:

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

      例如:

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

      【讨论】:

      • 这对我不起作用。我不断收到 CMake 错误:此项目中使用了以下变量,但它们设置为 NOTFOUND。请设置它们或确保它们在 CMake 文件中正确设置和测试:WIRINGPI_LIBRARIES 由目录 /home/thomas/CLionProjects/blink 中的目标“blink”链接
      【解决方案3】:

      为编译器标志提供标志-L &lt;path&gt;

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

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

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

      【讨论】:

      • 路径应该是怎样的?作为绝对路径,或者当我将wiringPi文件夹放在我的include中时:“-L/include/wiringPi/”?
      • 路径应该是libWiring.so所在目录的绝对路径。也许 -L/lib/libWiring/ 左右。
      • 现在我可以访问树莓派并且无法抗拒构建接线 pi。我用构建脚本构建了它。它生成了动态库的正确安装,因此 -lwiringPi 就像您之前使用的那样应该足以从编译器中引用该库。你从哪里弄来的图书馆? Hier 是如何安装库的链接。 .wiringpi.com/download-and-install
      • 啊我忘记了:经过这样的构建,动态库的路径是 /usr/lib/libwiringPi.so。
      • 是的,我是这样安装的,我也在 /usr/lib/ 中得到了这一行:#lrwxrwxrwx 1 root root 34 Mai 24 21:09 libwiringPi.so -> /usr/local/ lib/libwiringPi.so.2.25 所以我用“-L/usr/lib/libwiringPi.so”和“-L/usr/local/lib/libwiringPi.so.2.25”尝试了它,但都没有奏效。我做错了什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 2018-03-30
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多