对于我在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
谢谢,如果你能帮助我们的话! 对不起,如果我的英语不是那么好:) 祝你有愉快的一天。
答案 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指令的目标。然后,除了cmake
和make
之外,您还必须执行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})