【问题标题】:including external libraries in cmakelists.txt file在 cmakelists.txt 文件中包含外部库
【发布时间】:2015-09-29 13:24:44
【问题描述】:

我正在使用 cmake 构建可执行文件以在英特尔 Galileo 板上运行。

我的问题是如何在构建过程中包含外部 mraa 库。

Mraa library

  1. 当我从 git (1) 下载库时,是否需要按照此处所述构建它

Mraa compiling instructions

  1. 我需要在我的 CMakeLists.txt 文件中放入什么来获取库?

这是我目前在 CMakeLists.txt 文件中的内容,但我认为它是不正确的。

### MRAA ###
add_subdirectory(mraa-master/src)
file(GLOB mraa_SRC
    "mraa-master/src/*.c"
)

include_directories( "${PROJECT_SOURCE_DIR}/mraa-master/include"  )
add_library( ${MRAA_LIBRARY_NAME} SHARED  ${mraa_SRC}  )

谢谢

cmake_minimum_required(VERSION 2.8)

MESSAGE( STATUS "Starting build process")

SET( CMAKE_VERBOSE_MAKEFILE on )

if (CMAKE_BUILD_TYPE EQUAL "Debug")
MESSAGE(STATUS "Building in debug mode")
elseif (CMAKE_BUILD_TYPE EQUAL "Release")
MESSAGE(STATUS "Building in release mode")
endif()

SET(PROJECT_NAME "TestProject")
SET(APPLICATION_NAME "TestApplication")
SET(SAFE_STRING_LIBRARY "SafeString")
SET(APPLICATION_LIBRARY "Applibrary")

PROJECT( ${PROJECT_NAME} )

MESSAGE( STATUS "PROJECT: " ${PROJECT_NAME} )


SET(WRSDK_PATH "$ENV{WINDRIVER_SDK_DIR}")
IF (WRSDK_PATH)
else()
SET(WRSDK_PATH /opt/windriver/wrlinux/5.0-intel-quark/)
endif()

SET(APPLIBRARY_NAME  ${APPLICATION_LIBRARY} )
SET(SAFE_STRING_LIBRARY_NAME ${SAFE_STRING_LIBRARY} )

### SAFE STRING ###
add_subdirectory(SafeStringStaticLibrary/safeclib) 
file(GLOB safestring_SRC
"SafeStringStaticLibrary/safeclib/*.c" 
)

include_directories( "${PROJECT_SOURCE_DIR}/SafeStringStaticLibrary /safeclib"  ) 
add_library( ${SAFE_STRING_LIBRARY_NAME} SHARED  ${safestring_SRC}  ) 

include(ExternalProject)
ExternalProject_Add(mraa
    GIT_REPOSITORY https://github.com/intel-iot-devkit/mraa.git
    GIT_TAG        v0.8.0
    UPDATE_COMMAND ""
    INSTALL_COMMAND "" )


file(GLOB app_SRC
"classes/*.cpp"
"Logger.cpp"
"sqlite3.c"
"shell.c"
)

add_library( ${APPLIBRARY_NAME} SHARED ${app_SRC})
include_directories(  "${CMAKE_SOURCE_DIR}"     "${CMAKE_SOURCE_DIR}/SafeStringStaticLibrary/include" )

add_executable( ${APPLICATION_NAME} ${APPLICATION_NAME}.cpp

include_directories(  "${CMAKE_SOURCE_DIR}"   "${CMAKE_SOURCE_DIR}/SafeStringStaticLibrary/include"  "${CMAKE_SOURCE_DIR}/classes")

TARGET_LINK_LIBRARIES(  ${APPLICATION_NAME}  ${APPLIBRARY_NAME} ${SAFE_STRING_LIBRARY_NAME} -lrt -lpthread -lgcov -ldl)

【问题讨论】:

  • 这是您的解决方案,请在此处查看 1) stackoverflow.com/questions/24570916/…
  • @riverrock:要在您的项目中构建外部库,您可以使用ExternalProject_Add。如果您是 CMake 新手并且不清楚如何使用此功能,我建议您在项目之外构建外部库,并使用其完整路径链接。有很多资源描述了如何与外部库链接。
  • 嗨@Tsyvarev,我使用此处link 提供的说明在我的项目之外构建了mraa 库。然后我将这两行包含在我的 CMakeLists.txt 文件中。 include_directories( "${PROJECT_SOURCE_DIR}/mraa-master/include" ) TARGET_LINK_LIBRARIES( ${APPLICATION_NAME} ${CMAKE_SOURCE_DIR}/mraa-master/build/src/libmraa.so) 。我得到的错误是 mraa-master/build/src/libmraa.so: could not read symbols: File in wrong format
  • 如果你交叉编译你的项目,那么你也应该交叉编译mraa library。
  • @Tsyvarev mraa 库是一个支持 cmake 的库。如何将它包含在启用 cmake 的项目中,以便它与其余代码交叉编译?谢谢

标签: c++ cmake


【解决方案1】:

与 3d 派对项目一起构建项目的最简单方法是 add_subdirectory() 该子项目。下面的方法意味着您(手动)将mraa 项目的源代码下载(git clone)到项目源代码的mraa-lib 子目录中。

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

MESSAGE( STATUS "Starting build process")

# Configure subproject before definition of variables for main project.
#
# Subproject defines *mraa* library target.
add_subdirectory(mraa-lib)

# Before installation, public mraa headers are contained under *api* subdirectory.
include_directories(mraa-lib/api)

... # create executable ${APPLICATION_NAME}

# Linking with mraa library is straightforward.
target_link_libraries(${APPLICATION_NAME} mraa)

这样mraa 子项目将与您的项目一起配置、构建和安装。因此,如果您交叉编译您的项目(使用工具链文件,或在 IDE 中),子项目也将被交叉编译。

【讨论】:

    猜你喜欢
    • 2022-08-05
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多