CMake不能在树莓上编译

时间:2016-07-06 07:51:08

标签: c cmake raspberry-pi

我是cmake的新手。 使用cmake,我能够在笔记本电脑上编译我的项目,但在树莓上没有工作。

这是我在树莓上得到的错误:

-- 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".

这是我的项目结构:

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

这是第一个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)

这是librerie目录中的CMakeLists:

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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

你打两次电话

find_package(GLIB REQUIRED)

首次从顶级CMakeLists.txt调用它并定义glib-2.0目标。第二次从librerie/CMakeLists.txt调用它并尝试再次创建glib-2.0。这就是您看到错误消息的原因:目标已在此范围内定义。

可能的解决方法是首先进入库子目录,然后在顶级 CMakeLists.txt 中调用find_package()

add_subdirectory (librerie)

find_package(GLIB REQUIRED)
find_package(MHD REQUIRED)

由于 IMPORTED 目标具有本地可见性,因此从子目录 librerie / 调用glib-2.0后定义的find_package(GLIB)目标将不会显示子目录。因此,来自顶级目录的第二次调用将成功。