Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
管理CMake变量_Cmake - Fatal编程技术网

管理CMake变量

管理CMake变量,cmake,Cmake,我对linux、cmake和软件/计算机的世界是全新的,我只是在学习如何使用命令行,如果这让你知道我在哪里,但不知何故我发现自己是一名软件实习生,我是一名电子工程专业的学生。我的任务是使用cmake和make构建一个软件包,但进展并不顺利。我正在努力理解与包相关的顶级CMakeLists.txt文件中的每一行,我感到难以置信的不称职。我已经阅读了一些关于cmake的文档,虽然我对cmake如何使用CMakeLists.txt文件有一定的了解,但仍有一些细节需要澄清 1有许多变量正在使用,我想知道

我对linux、cmake和软件/计算机的世界是全新的,我只是在学习如何使用命令行,如果这让你知道我在哪里,但不知何故我发现自己是一名软件实习生,我是一名电子工程专业的学生。我的任务是使用cmake和make构建一个软件包,但进展并不顺利。我正在努力理解与包相关的顶级CMakeLists.txt文件中的每一行,我感到难以置信的不称职。我已经阅读了一些关于cmake的文档,虽然我对cmake如何使用CMakeLists.txt文件有一定的了解,但仍有一些细节需要澄清

1有许多变量正在使用,我想知道它们的值是什么。但是,并非CMakeLists.txt文件中的所有变量都显示在CMakeCache.txt文件中。例如,考虑下面的命令

SET(bioreader_common_LIBS

${bioreader_common_LIBS}

    QtCore
    QtScript
    QtScriptTools
    QtNetwork
    QtGui
    QtTest
    QtXml
    QtDBus
    QtSql

    mongoclient.a
    bsd
    ssl
    crypto
    boost_system
    boost_thread
    boost_filesystem
    boost_program_options
    )
CMakeLists.txt文件中没有定义变量bioreader_common_LIBS,且其未包含在缓存中。很明显,它的价值只是一个库列表。是否有一种方法可以通过命令行返回此变量的值

在谷歌搜索了cmake变量后,我发现了一个wiki页面,详细介绍了有用的cmake变量。我一直在努力寻找这些变量的值,但运气不好。例如,其中一个有用的变量是CMAKE_LIBRARY_PATH。虽然在CMakeLists.txt或CMakeCache.txt文件中没有对该变量的引用,但它似乎仍然存在并有一个值,但我找不到它

3运行cmake和make后,我遇到的最大问题之一是无法链接到某些库。例如,有一个必需的sql数据库驱动程序插件mysql,我相信它作为12.so文件存在于usr/lib/mysql/plugin中。我意识到我需要修改CMakeLists.txt文件以包含这些库,或者可能在某个地方添加路径,但我不知道如何做。即使我知道在哪里添加库,我也不知道如何在CMakeLists.txt中命名库,我认为驱动程序的名称是mysql,但从技术上讲,这不是你在CMakeLists.txt文件中所说的

我所指的CMakeLists.txt文件如下所示。对不起,如果这个问题看起来很愚蠢,但我完全迷路了,感到非常沮丧

cmake_minimum_required(VERSION 2.4)
if(COMMAND cmake_policy)
  cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)

project (bioreader)

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/;${CMAKE_MODULE_PATH}")
# Find Qt libraries
INCLUDE(FindQt4) # will find QMake moc includes and libraries for us
INCLUDE(${QT_USE_FILE})
FIND_PACKAGE(Qt4 REQUIRED)
LINK_DIRECTORIES(${QT_LIBRARY_DIR})

# Find MongoDB libraries
FIND_PACKAGE(MongoDB REQUIRED)

# Find Boost libraries
FIND_PACKAGE(Boost REQUIRED)

# Custom dependencies
INCLUDE(AddFileDependencies)

# Qt/Qtopia
include (${QT_USE_FILE})
INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}/QtCore/)
INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}/QtGui/)
INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}/QtNetwork/)
INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}/QtScript/)
INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}/QtScriptTools/)
INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}/QtTest/)
INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}/QtXml/)
INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}/QtDBus/)
INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}/QtSql/)

# Optimized?
OPTION (OPTIMIZED "Compile in the optimized mode?" ON)
OPTION (ATOM "Optimize for Intel Atom 32-bit?" OFF)
OPTION (PROFILING "Add profiling information to executable?" OFF)
ADD_DEFINITIONS (-Wall -fno-strict-aliasing -Wno-strict-aliasing)

IF(OPTIMIZED)
  ADD_DEFINITIONS (-O3)
IF (ATOM)
  ADD_DEFINITIONS (-m32 -march=core2 -mtune=pentium -mfpmath=sse)
ENDIF (ATOM)
ELSE(OPTIMIZED)
  ADD_DEFINITIONS (-g)
ENDIF(OPTIMIZED)

IF(PROFILING)
  ADD_DEFINITIONS (-pg)
ENDIF(PROFILING)

# Ban exceptions? (used only for testing/refactoring)
OPTION (KILL_EXCEPTIONS "Disable support for exceptions?" OFF)
IF (KILL_EXCEPTIONS)
  ADD_DEFINITIONS(-fno-exceptions)
ENDIF(KILL_EXCEPTIONS)

# Attempt to compile the code with ALL warnings enabled (ie. "pedantic
# mode")?
OPTION (PEDANTIC_MODE "Compile with all compiler warnings enabled?" ON)
IF (PEDANTIC_MODE)
  ADD_DEFINITIONS (-pedantic -Wno-long-long -DUSING_PEDANTIC_MODE)
ENDIF (PEDANTIC_MODE)

# Linear algebra library
OPTION (LAPACK "Use LAPACK linear algebra library" ON)
IF(LAPACK)
  MESSAGE(STATUS "Building using LAPACK.")
  ADD_DEFINITIONS (-DUSING_LAPACK)
ELSE(LAPACK)
  MESSAGE(STATUS "Building WITHOUT using LAPACK.")
ENDIF(LAPACK)

# Package subdirectories. These statements load the CMakeLists.txt files
# from the subordinate directories.

##
add_subdirectory (src/IO)
add_subdirectory (src/Instrument)
add_subdirectory (src/Protocol)
add_subdirectory (src/Script)
add_subdirectory (src/Physical)

add_subdirectory (rc/data)
add_subdirectory (rc/jslib)
add_subdirectory (rc/gfx)
add_subdirectory (rc/svninfo)


# Set up generic includes
include_directories (${bioreader_SOURCE_DIR})
include_directories (${bioreader_SOURCE_DIR}/src)
link_directories (${bioreader_BINARY_DIR})
link_directories (/usr/lib)

##
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

SET (bioreader_common_LIBS
    Instrument

    rcjslibCore
    rcjslibBioScript
    rcjslibRobot
    rcgfx
    rcsvninfo
    rcdata

    Physical
    PhysicalController
    PhysicalUnit

    Protocol
    IO
    IOqextserialport
)

SET(bioreader_common_LIBS
${bioreader_common_LIBS}

QtCore
QtScript
QtScriptTools
QtNetwork
QtGui
QtTest
QtXml
QtDBus
QtSql

mongoclient.a
bsd
ssl
crypto
boost_system
boost_thread
boost_filesystem
boost_program_options
)

IF(LAPACK)
  SET (bioreader_common_LIBS
        ${bioreader_common_LIBS}
        lapack
        blas
        gfortran)
ENDIF(LAPACK)

SET (bioreader_reader_LIBS
    InstrumentBuilderReader
    InstrumentBuilderUnitTest

    ProtocolTest
    InstrumentTest
    PhysicalControllerTest
    PhysicalUnitTest
    InstrumentBioTest

    InstrumentBio
    Script

    PhysicalPump
    PhysicalElevator
    PhysicalMotor
    PhysicalRobot

    ${bioreader_common_LIBS}
)

##
## BIOSCALE_QUICKAPP  APPNAME  SOURCES src1.cpp src2.cpp LIBS
##
MACRO(BIOSCALE_QUICKAPP APPNAME)

SET(__MODE "SOURCES") # default

FOREACH(ARG ${ARGN})
  IF( ${ARG} STREQUAL "SOURCES" )
    SET(__MODE "SOURCES")
  ELSEIF( ${ARG} STREQUAL "LIBS" )
    SET(__MODE "LIBS")
  ELSE( ${ARG} STREQUAL "SOURCES" )
    ##
    ## source
    ##
  IF( ${__MODE} STREQUAL "SOURCES")
     SET(${APPNAME}_SRCS ${${APPNAME}_SRCS} ${ARG}) # append to var
  ENDIF( ${__MODE} STREQUAL "SOURCES")

  ##
  ## libs
  ##
  IF( ${__MODE} STREQUAL "LIBS")
     SET(${APPNAME}_LIBS ${${APPNAME}_LIBS} ${ARG}) # append to var
  ENDIF( ${__MODE} STREQUAL "LIBS")
  ENDIF( ${ARG} STREQUAL "SOURCES" )
ENDFOREACH(ARG)

QT4_AUTOMOC(${${APPNAME}_SRCS})

add_executable(${APPNAME} ${${APPNAME}_SRCS})
target_link_libraries(${APPNAME} ${${APPNAME}_LIBS})

ENDMACRO(BIOSCALE_QUICKAPP)

## Configuration for all targets
SET (bioreader_SRCS src/universal.cpp)

# Executable target for unit tests
BIOSCALE_QUICKAPP (unittest 
    SOURCES ${bioreader_SRCS}
    LIBS    ${bioreader_reader_LIBS})

# Executable target for reader
BIOSCALE_QUICKAPP (reader 
    SOURCES ${bioreader_SRCS}
    LIBS    ${bioreader_reader_LIBS})

IF(PROFILING)
  SET_TARGET_PROPERTIES(reader PROPERTIES LINK_FLAGS -pg)
ENDIF(PROFILING)

这是一个很大的帖子,我可能无法一下子回答所有的问题。但是,我会从顶部开始,尝试回答我遇到的问题。似乎任何理解都会让你走得更远。谁知道呢,也许我会回答真正的问题

Q1 CMakeLists.txt文件中没有定义变量bioreader_common_LIBS

A1 SETbioreader_common_LIBS${bioreader_common_LIBS}QtCore QtScript。。。。 是定义生物反应器的常用库。set调用所做的是,将bioreader_common_LIBS设置为当前定义的任何值,注意syntx${..},它为您提供变量的值。加上随后的内容,例如Qt LIB。您可以看到在文件中如何使用相同类型的行,即附加到bioreader_common_LIBS的当前值

Q2已定义生物读取器_公共_库,其未包含在缓存中。 A2要将其添加到缓存中,set调用如下所示。。 setbioreder_common_LIBS${bioreder_common_LIBS}lib1 lib2缓存字符串

Q3 A3“有用的CMake变量”由CMake在适当的时候设置,并且不一定存在于您的CMakeLists.txt中,除非您将它们设置为您需要的内容。如果要查看任何变量的值,请尝试,例如。 消息变量名称:${var\u name} 查看var_name的值。配置项目时将打印这些消息

Q4其余的。。。 A4需要记住的一点是,每个子目录中都有一个CMakeLists.txt文件,用于控制其中库的配置/构建

要查找库,请遵循CmakeList中的Boost示例。使用具有正确包名的find_packageMySQL REQUIRED调用。您可以在CMake_install_目录/Modules中找到CMake提供的模块。如果没有,那你就得写下来。Find模块在成功时提供了几个有用的变量。它们通常在文件中描述,但大致上您将使用MySQL作为示例MySQL_FOUND-告诉您如果CMake找到了它,MySQL_包括_DIR-头的路径,MySQL_库和/或MySQL_库-库的名称,MySQL_LIB_DIR-库目录

现在,您可以在CMake文件中看到include_目录,您可以添加 include_目录${MySQL_include_DIR} 将其添加到编译器参数的-I中。你可以用 链接目录${MySQL\u LIB\u DIR} 添加该目录以进行链接。现在,要链接您的库,请致电 目标链接库 my_lib${MySQL_LIBRARIES}

需要注意的是,您当前的CMake文件有一些坏习惯,即它显式地命名要链接的库。这是不推荐的,因为它将您与库提供者的突发奇想紧密联系在一起。名称可以更改,因此您最好始终使用find模块中提供的变量。而且,我相信你永远不需要添加 链接目录/usr/lib 因为那个目录通常已经在默认的搜索路径中了,尽管我想拥有它不会有什么坏处


这应该会让你朝着正确的方向前进,我一次输入的内容太多了。

你可以使用messagestatus打印变量的值,变量的值是${variable\u name}。有一些文件像FindBoost.cmake,它们已经随cmake一起提供了,如果你找不到适合你的文件,你可以在互联网上搜索,有些人可能已经创建了一个,只要稍加更新,它们通常都能工作。。