在cmake中使用configure和make

/*******************************************************************
• 此文章解释权归windsome所有,如要转载无须联系本人。
• 转载需要包含此抬头信息,如有疑问,欢迎联系本人。
• QQ: 35327864
• msn: fgwf1@hotmail.com
• mail: agooou@gmail.com
 ********************************************************************/

目前linux上各种工具软件源码包都是使用标准的gnu的configure进行打包。如果将这些开发包都使用cmake方式来改写makefile系统,工作量将很巨大。比较好的方法是直接在cmake中进行configure并且make,然后使用生成的这些库和头文件。过程如下所述。

我是基于原先的一个项目上面加内容,项目路径为/home/Dev/DigitalSignage,项目名称在CMakeList.txt中定义为DS,其源码根路径为DS_SOURCE_DIR=/home/Dev/DigitalSignage,其二进制目录为DS_BINARY_DIR=/home/Dev/DigitalSignage/build。我的cmake文件放在${DS_SOURCE_DIR}/cmake下。我新建了一个文件BuildGNUPackage.cmake用于我们对标准gnu源码库进行操作。

1,设置软件包安装路径及编译工具
SET(GNUPKG_INSTALL_PATH ${DS_BINARY_DIR}/gnupkg/install)
SE(GNUPKG_CC ${CMAKE_C_COMPILER})
SET(GNUPKG_CXX ${CMAKE_CXX_COMPILER})
IF(DS_ENABLE_CCACHE)
    SET(GNUPKG_CC ${CMAKE_C_COMPILER_ARG1})
    SET(GNUPKG_CXX ${CMAKE_CXX_COMPILER_ARG1})
ENDIF(DS_ENABLE_CCACHE)

2,编写CONFIG_GNU_PACKAGE宏,用以对源码包进行配置,_pkg_name为软件包名称,如sigc++_config(后面带_config的原因是跟下面的BUILD_GNU_PACKAGE宏中名字区分开), _pkg_rpath为相对于DS_SOURCE_DIR的相对路径如3rdParties/libsigc++2.0,_pkg_options为configure的参数,如--host=mips
MACRO(CONFIG_GNU_PACKAGE _pkg_name _pkg_rpath _pkg_options)
    SET(GNUPKG_SOURCE_PATH ${DS_SOURCE_DIR}/${_pkg_rpath})
    SET(GNUPKG_BINARY_PATH ${DS_BINARY_DIR}/gnupkg/${_pkg_rpath})
    SET(GNUPKG_CONFIG_TARGETS ${GNUPKG_CONFIG_TARGETS} ${_pkg_name})

    ADD_CUSTOM_TARGET(
        ${_pkg_name}
        COMMENT "config ing ${_pkg_name} in ${_pkg_rpath}"
        COMMAND mkdir -p ${GNUPKG_BINARY_PATH}
        COMMAND mkdir -p ${GNUPKG_INSTALL_PATH}
        )
    ADD_CUSTOM_COMMAND(
        TARGET ${_pkg_name}
        COMMENT "options: ${_pkg_options}"
        COMMAND export CC=${GNUPKG_CC}
        COMMAND export CXX=${GNUPKG_CXX}
        COMMAND export CFLAGS=${GNUPKG_CFLAGS}
        COMMAND export CXXFLAGS=${GNUPKG_CXXFLAGS}
        COMMAND ${GNUPKG_SOURCE_PATH}/configure ${_pkg_options}
        WORKING_DIRECTORY ${GNUPKG_BINARY_PATH}
        VERBATIM
        NO_ESCAPE_QUOTE
        )
ENDMACRO(CONFIG_GNU_PACKAGE)

3,编写BUILD_GNU_PACKAGE宏,用来编译上一步配置好的软件包
MACRO(BUILD_GNU_PACKAGE _pkg_name _pkg_rpath)
    SET(GNUPKG_BINARY_PATH ${DS_BINARY_DIR}/gnupkg/${_pkg_rpath})
    SET(GNUPKG_BUILD_TARGETS ${GNUPKG_BUILD_TARGETS} ${_pkg_name})
    ADD_CUSTOM_TARGET(
        ${_pkg_name}
        COMMENT "building ${_pkg_name} in ${_pkg_rpath}"
        )
    ADD_CUSTOM_COMMAND(
        TARGET ${_pkg_name}
        COMMAND make
        COMMAND make install
        WORKING_DIRECTORY ${GNUPKG_BINARY_PATH}
        )
ENDMACRO(BUILD_GNU_PACKAGE)

4,添加软件包
SET(GNUPKG_CONFIG_TARGETS "")
SET(GNUPKG_BUILD_TARGETS "")
IF(DS_TARGET STREQUAL "X86")
    CONFIG_GNU_PACKAGE(libsigcxx_cfg 3rdParties/libsigc++-2.2.8 "--enable-shared=yes")
ENDIF(DS_TARGET STREQUAL "X86")

IF(DS_TARGET STREQUAL "SMP865X")
    CONFIG_GNU_PACKAGE(libsigcxx_cfg 3rdParties/libsigc++-2.2.8 "--host=mips")
ENDIF(DS_TARGET STREQUAL "SMP865X")

BUILD_GNU_PACKAGE(libsigcxx_build 3rdParties/libsigc++-2.2.8)
SET(DS_SIGC++_INCLUDE_DIR ${GNUPKG_INSTALL_PATH}/include/sigc++-2.0 ${GNUPKG_INSTALL_PATH}/lib/sigc++-2.0/include)
SET(DS_SIGC++_LIBRARY_DIR ${GNUPKG_INSTALL_PATH}/lib)
SET(DS_SIGC++_LIBS sigc-2.0)

5,添加一个总的配置所有package的目标
ADD_CUSTOM_TARGET(ds_gnupkg_config
    COMMENT "config done all gnu packages!"
    )
ADD_DEPENDENCIES(ds_gnupkg_config
    ${GNUPKG_CONFIG_TARGETS}
    )
6,添加一个总的编译所有package的目标
ADD_CUSTOM_TARGET(ds_gnupkg_build
    COMMENT "built done all gnu packages"
    )
ADD_DEPENDENCIES(ds_gnupkg_build
    ${GNUPKG_BUILD_TARGETS}
    )

7,你可以到所需要的地方用DS_SIGC++_INCLUDE_DIR , DS_SIGC++_LIBRARY_DIR , DS_SIGC++_LIBS等宏对sigc++进行调用

8,最后你可以到DS_BINARY_DIR去执行
ccmake ..
make ds_gnupkg_config
make ds_gnupkg_build



备注:
CONFIG_GNU_PACKAGE这个宏在调用的时候会有问题。_pkg_options参数中内容经常会不止一个,在目前cmake-2.8.3版本及之前都不能将这个字符串正确的传入到ADD_CUSTOM_COMMAND的COMMAND命令中。
如:你调用CONFIG_GNU_PACKAGE(libsigcxx_cfg 3rdParties/libsigc++-2.2.8 "--host=x86 --target=mips"),运行make ds_gnupkg_config VERBOSE=1后,会看到调用的shell命令转换成了/home/Dev/DigitalSignage/3rdParties/libsigc++-2.2.8/configure --build=mips/ --host=x86,它将_pkg_options里的空格转义了!
翻看ADD_CUSTOM_COMMAND的用法后添加了一个参数VERBATIM到ADD_CUSTOM_COMMAND的最后,虽然不转义了,但在_pkg_options前后添加了双引号,变成了/home/Dev/DigitalSignage/3rdParties/libsigc++-2.2.8/configure "--build=mips --host=x86"。
再尝试了各种方法(包括使用环境变量,LIST模式)之后,发现无论怎样都不奏效。最后,下载了2.8.3版本的源码,翻看了源码后发现ADD_CUSTOM_COMMAND命令对COMMAND的后续内容做了处理,要么加引号,要么加转义符,只是对一些shell的操作符如 ">" ,"|>"等没有转义。
据此,我修改了cmake2.8.3的源码在ADD_CUSTOM_COMMAND中添加了一个操作符NO_ESCAPE_QUOTE,使得ADD_CUSTOM_COMMAND不做转义和添加双引号。NO_ESCAPE_QUOTE的位置等同VERBATIM。

 

附件:

BuildGNUPackage.cmake (http://u.115.com/file/f2c1b5d883)

cmake-2.8.3.modify.tar.bz2 ( http://u.115.com/file/f2862c7372 )

 

 


### 回答1: 可以使用cmake-gui工具,在Qt添加asio库:首先打开cmake-gui,然后添加asio源文件路径,然后添加asio库路径,最后点击“Configure”和“Generate”按钮,即可完成添加asio库的步骤。 ### 回答2: 在Qt使用CMake添加ASIO库,可以按照以下步骤进行: 1. 首先,确保已经安装了ASIO库。可以从官方网站(https://think-async.com/Asio/)下载ASIO库,并进行安装。 2. 打开Qt创建一个新的C++项目。 3. 在项目目录创建一个名为"CMakeLists.txt"的文件。 4. 在"CMakeLists.txt"文件添加以下内容: ``` cmake_minimum_required(VERSION 3.5) project(MyProject) set(CMAKE_CXX_STANDARD 11) add_executable(MyProject main.cpp) target_link_libraries(MyProject asio) ``` 5. 将ASIO库的路径添加到CMake。在上述代码,`target_link_libraries`行后面添加以下内容: ``` target_include_directories(MyProject PRIVATE /path/to/asio/headers) ``` 将“/path/to/asio/headers”替换为ASIO库的实际路径。 6. 保存并关闭"CMakeLists.txt"文件。 7. 在Qt的"项目"视图,右键单击项目文件夹,然后选择"重新加载CMake项目"。 8. 在Qt的"项目"视图,右键单击项目文件夹,然后选择"构建项目"。 9. 构建成功后,使用Qt的"运行"按钮运行项目。 通过上述步骤,你就可以在Qt使用CMake添加并使用ASIO库了。请注意,确保配置正确的ASIO库路径以及正确的CMake和Qt版本,以避免可能遇到的问题。 ### 回答3: 在Qt使用CMake添加Asio库需要以下步骤: 1. 首先,确保你的Qt项目目录包含了CMakeLists.txt文件。如果没有,请新建一个。 2. 在CMakeLists.txt文件的开头,添加以下内容,以指定CMake的最低版本和项目名称: ``` cmake_minimum_required(VERSION 3.5) project(YourProjectName) ``` 3. 在CMakeLists.txt文件,添加以下内容来引入Qt的相关模块: ``` find_package(Qt5 COMPONENTS Core Network REQUIRED) ``` 4. 添加Asio库的路径,可以是相对路径或绝对路径。比如,如果Asio库的源代码位于项目目录的"third_party/asio"文件夹下,添加以下内容: ``` add_subdirectory(third_party/asio) ``` 5. 在CMakeLists.txt文件,添加以下内容,来设置与Asio库的链接选项,同时链接Qt模块: ``` target_link_libraries(YourProjectName PRIVATE Qt5::Core Qt5::Network asio) ``` 6. 最后,在你的Qt项目使用CMake来构建项目。打开终端,切换到项目目录,执行以下指令: ``` mkdir build cd build cmake .. make ``` 这将会生成你的Qt应用程序,并自动链接Asio库。你可以通过运行生成的可执行文件来启动应用程序。 这样,你就成功地在Qt使用CMake添加了Asio库。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值