2016-07-06 15 views
0

Ich bin neu mit cmake. Mit cmake konnte ich mein Projekt auf meinem Laptop zusammenstellen, aber auf der Himbeere klappt es nicht.CMake nicht auf Himbeere kompilieren

Dies ist der Fehler, den ich auf Himbeere erhalten:

-- The C compiler identification is GNU 4.9.2 
-- The CXX compiler identification is GNU 4.9.2 
-- Check for working C compiler: /usr/bin/cc 
-- Check for working C compiler: /usr/bin/cc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler: /usr/bin/c++ 
-- Check for working CXX compiler: /usr/bin/c++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.28") 
-- checking for one of the modules 'glib-2.0' 
-- Found GLib: /usr/lib/arm-linux-gnueabihf/libglib-2.0.so (found version "2.42.1") 
-- Found mhd: /usr/include 
CMake Error at cmake/FindGLIB.cmake:39 (add_library): add_library cannot create imported target "glib-2.0" because another target with the same name already exists. 
Call Stack (most recent call first):librerie/CMakeLists.txt:2 (find_package) 

-- Found GLib: /usr/lib/arm-linux-gnueabihf/libglib-2.0.so (found version "2.42.1") 
-- Configuring incomplete, errors occurred! 
See also "/home/pi/pl1/CMakeFiles/CMakeOutput.log". 

Diese Struktur ist mein Projekt:

src-> 
---- CMakeLists.txt 
---- main.c 
---- librerie-> 
-------------- CMakeLists.txt 
-------------- cJSON.c 
-------------- cJSON.h 
-------------- config.c 
-------------- config.h 
-------------- server_web.c 
-------------- server_web.h 
-------------- funzioni_thread.c 
-------------- funzioni_thread.h 
---- cmake-> 
-------------- FindGLIB.cmake 
-------------- FindMHD.cmake 

Dies ist das erste CMakeLists:

cmake_minimum_required (VERSION 2.6) 
project (TestPL) 

include_directories("${PROJECT_BINARY_DIR}") 
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") 

find_package(GLIB REQUIRED) 
find_package(MHD REQUIRED) 

add_subdirectory (librerie) 
set (EXTRA_LIBS ${EXTRA_LIBS} librerie) 

include_directories (${GLib_INCLUDE_DIRS} ${EXTRA_LIBS}) 

# add the executable 
add_executable(TestPL main.c) 
target_link_libraries (TestPL ${GLib_LIBRARY} ${MHD_LIBRARY} ${EXTRA_LIBS} m) 

Diese CMakeLists in Librerie ist Verzeichnis:

find_package(GLIB REQUIRED) 
find_package(MHD REQUIRED) 
include_directories (${GLib_INCLUDE_DIRS} ${EXTRA_LIBS}) 

add_library (librerie cJSON.c config.c generic.c server_web.c funzioni_thread.c) 
target_link_libraries (librerie ${GLib_LIBRARY} ${MHD_LIBRARY}) 

Was mache ich falsch?

Antwort

1

Sie rufen zweimal

find_package(GLIB REQUIRED) 

Zum ersten Mal aus der obersten Ebene genannt wird CMakeLists.txt und definiert glib-2.0 Ziel. Zum zweiten Mal wird es von librerie/CMakeLists.txt aufgerufen und versucht erneut glib-2.0 zu erstellen. Deshalb sehen Sie diese Fehlermeldung: Das Ziel ist bereits in diesem Bereich definiert.

mögliche Abhilfe ist, zuerst in Bibliothek-Unterverzeichnis Schritt und dann ruft nur find_package() in der obersten Ebene CMakeLists.txt:

add_subdirectory (librerie) 

find_package(GLIB REQUIRED) 
find_package(MHD REQUIRED) 

Weil IMPORTIERTEN Ziele lokale Sicht hat, glib-2.0 Ziel definiert durch find_package(GLIB) Der Aufruf aus dem Unterverzeichnis librerie/ ist nach der Rückkehr aus diesem Unterverzeichnis nicht sichtbar. Der zweite Aufruf vom Verzeichnis der obersten Ebene wird also erfolgreich sein.

+0

Vielen Dank !! Das war das Problem, jetzt funktioniert es! Was ich nicht verstehe, ist, warum sogar der falsche Weg auf meinem Laptop leise läuft – Mex

+0

Wahrscheinlich hat Ihr Laptop ein anderes 'FindGLIB.cmake' Skript, welches nicht importierte Ziele sondern Variablen definiert. Im Gegensatz zu Zielen ist die Neudefinition von Variablen kein Fehler in CMake. – Tsyvarev

+0

Das FindGLIB.cmake-Skript ist das gleiche für Himbeere und Laptop, ich kopierte alle Projektdateien, vielleicht auf Arm macht die Dinge anders ?, boh, wie auch immer, danke nochmal! – Mex