2015-05-24 21 views
0

上的cmake我想創建一個cmake文件來編譯和鏈接所有內容。
這是迄今爲止我的目錄結構:在我的C++項目中添加wiringPi lib到RaspberryPi

"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' DIR我得到了所有的.cpp文件,並在'包含'我的所有標題。當我comiling,我進入我的build目錄,刪除所有現有的在那裏(從以前的版本),並在現在鍵入

cmake .. 
make 

我的問題,我在SRC main.cpp中使用「的#include wiringPi。 H」,但是當我做它給了我下面的錯誤項目:

[email protected] ~/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 

讓我怎麼告訴在C進行編譯器在哪裏找,以及如何使用wiringPi LIB?有沒有更簡單的方法,而不是刪除我的生成文件夾中的所有內容之前?就像它一次編譯所有'靜態'文件,並且每次只添加更改文件(= main.cpp)。

而且我要到處執行我的程序像

sudo minimu 

而不是進入了「建設」目錄,然後鍵入

sudo ./minimu 

感謝,如果你能幫助我的傢伙!
對不起,如果我的英語不是那麼好:)
有一個愉快的一天。

回答

0

爲編譯器標誌提供一個標誌-L <path>

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

我不明白,爲什麼你清除運行cmake的前build目錄(這不是批評。我真不明白,有可能是一個原因,我不知道)。檢查源是否比上次編譯輸出更新並僅編譯受影響的文件。但是這隻有在不刪除構建目標的情況下才有效。

要安裝生成的程序,請在您的cmake中取消註釋install指令並設置PATH中的目標目錄。你也可以創建一個dir/home // bin等。將其加到PATH環境變量中,並使用新路徑配置安裝指令的目標。然後,除了cmakemake,您必須執行make install

+0

路徑應該如何顯示?作爲絕對路徑,或者像我將wiringPi文件夾放在我的include中時:「-L/include/wiringPi /」? – SkyHigh

+0

該路徑應該是libWiring.so所在目錄的絕對路徑。也許-L/lib/libWiring /左右。 –

+0

現在我可以訪問一個覆盆子,並不能抵制建築物配線pi。我使用構建腳本構建它。它產生了一個動態庫的正確安裝,所以-lwiringPi就像你之前使用它應該足以從編譯器引用庫。你從哪裏拿到圖書館? Hier是如何安裝庫的鏈接。 .http://wiringpi.com/download-and-install/ –

5

由於塞巴斯蒂安在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,然後重試。請確定您刪除了高速緩存而不是列表!

相關問題