管理CMake变量
我对linux、cmake和软件/计算机的世界是全新的,我只是在学习如何使用命令行,如果这让你知道我在哪里,但不知何故我发现自己是一名软件实习生,我是一名电子工程专业的学生。我的任务是使用cmake和make构建一个软件包,但进展并不顺利。我正在努力理解与包相关的顶级CMakeLists.txt文件中的每一行,我感到难以置信的不称职。我已经阅读了一些关于cmake的文档,虽然我对cmake如何使用CMakeLists.txt文件有一定的了解,但仍有一些细节需要澄清 1有许多变量正在使用,我想知道它们的值是什么。但是,并非CMakeLists.txt文件中的所有变量都显示在CMakeCache.txt文件中。例如,考虑下面的命令管理CMake变量,cmake,Cmake,我对linux、cmake和软件/计算机的世界是全新的,我只是在学习如何使用命令行,如果这让你知道我在哪里,但不知何故我发现自己是一名软件实习生,我是一名电子工程专业的学生。我的任务是使用cmake和make构建一个软件包,但进展并不顺利。我正在努力理解与包相关的顶级CMakeLists.txt文件中的每一行,我感到难以置信的不称职。我已经阅读了一些关于cmake的文档,虽然我对cmake如何使用CMakeLists.txt文件有一定的了解,但仍有一些细节需要澄清 1有许多变量正在使用,我想知道
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一起提供了,如果你找不到适合你的文件,你可以在互联网上搜索,有些人可能已经创建了一个,只要稍加更新,它们通常都能工作。。