我是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)


这是图书馆目录中的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})


我究竟做错了什么?

最佳答案

你打了两次

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)


由于导入的目标具有本地可见性,因此从此子目录返回后,由子目录librerie /的glib-2.0调用定义的find_package(GLIB)目标将不可见。因此,从顶级目录进行的第二次调用将成功。

关于c - CMake无法在树莓派上编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38218838/

10-12 04:49