1. 怎样使用cmake和编译
做一个项目就知道了。 基本就是模块化,每一个子目录一个cmake, 然后主目录的cmake一个个去链接。 构建项目时把include和src分开会方便很多。
2. cmake编译错误是什么原因
1由于之前我是用过CMake生成简单的PCL程序,在cmd下都是运行成功的,所以CMake应该是没问题的。2PCL的源码我下载之后,我直接解压到CMake的源文件路径里,这也应该没什么问题啊。3第三方库,我也都下了官网推荐的版本,也没什么问题啊,都是安装到默认的文件夹中。CMake编译仍然存在错误FoundOpenMPBoostversion:1.47.:systemfilesystemthreaddate_timeiostreams
3. 如何使用CMake进行交叉编译
cmake交叉编译配置
很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译。即在你host宿主机上要生成target目标机的程序。里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等,我今天仅仅简单介绍下相关CMake在面对交叉编译的时候,需要做的一些准备工作。
CMake给交叉编译预留了一个很好的变量CMAKE_TOOLCHAIN_FILE,它定义了一个文件的路径,这个文件即toolChain,里面set了一系列你需要改变的变量和属性,包括C_COMPILER,CXX_COMPILER,如果用Qt的话需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的话需要更改的BOOST_ROOT(具体查看相关Findxxx.cmake里面指定的路径)。CMake为了不让用户每次交叉编译都要重新输入这些命令,因此它带来toolChain机制,简而言之就是一个cmake脚本,内嵌了你需要改变以及需要set的所有交叉环境的设置。
toolChain脚本中设置的几个重要变量
1.CMAKE_SYSTEM_NAME:
即你目标机target所在的操作系统名称,比如ARM或者Linux你就需要写"Linux",如果Windows平台你就写"Windows",如果你的嵌入式平台没有相关OS你即需要写成"Generic",只有当CMAKE_SYSTEM_NAME这个变量被设置了,CMake才认为此时正在交叉编译,它会额外设置一个变量CMAKE_CROSSCOMPILING为TRUE.
2. CMAKE_C_COMPILER:
顾名思义,即C语言编译器,这里可以将变量设置成完整路径或者文件名,设置成完整路径有一个好处就是CMake会去这个路径下去寻找编译相关的其他工具比如linker,binutils等,如果你写的文件名带有arm-elf等等前缀,CMake会识别到并且去寻找相关的交叉编译器。
3. CMAKE_CXX_COMPILER:
同上,此时代表的是C++编译器。
4. CMAKE_FIND_ROOT_PATH:
指定了一个或者多个优先于其他搜索路径的搜索路径。比如你设置了/opt/arm/,所有的Find_xxx.cmake都会优先根据这个路径下的/usr/lib,/lib等进行查找,然后才会去你自己的/usr/lib和/lib进行查找,如果你有一些库是不被包含在/opt/arm里面的,你也可以显示指定多个值给CMAKE_FIND_ROOT_PATH,比如
set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)
该变量能够有效地重新定位在给定位置下进行搜索的根路径。该变量默认为空。当使用交叉编译时,该变量十分有用:用该变量指向目标环境的根目录,然后CMake将会在那里查找。
5. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:
对FIND_PROGRAM()起作用,有三种取值,NEVER,ONLY,BOTH,第一个表示不在你CMAKE_FIND_ROOT_PATH下进行查找,第二个表示只在这个路径下查找,第三个表示先查找这个路径,再查找全局路径,对于这个变量来说,一般都是调用宿主机的程序,所以一般都设置成NEVER
6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:
对FIND_LIBRARY()起作用,表示在链接的时候的库的相关选项,因此这里需要设置成ONLY来保证我们的库是在交叉环境中找的.
7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:
对FIND_PATH()和FIND_FILE()起作用,一般来说也是ONLY,如果你想改变,一般也是在相关的FIND命令中增加option来改变局部设置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH
8. BOOST_ROOT:
对于需要boost库的用户来说,相关的boost库路径配置也需要设置,因此这里的路径即ARM下的boost路径,里面有include和lib。
9. QT_QMAKE_EXECUTABLE:
对于Qt用户来说,需要更改相关的qmake命令切换成嵌入式版本,因此这里需要指定成相应的qmake路径(指定到qmake本身)
toolChain demo
# this is required
SET(CMAKE_SYSTEM_NAME Linux)
# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/arm/ppc_74xx /home/rickk/arm_inst)
# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)
这样就完成了相关toolChain的编写,之后,你可以灵活的选择到底采用宿主机版本还是开发机版本,之间的区别仅仅是一条-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做转移,但目标平台是同一个,你仅仅需要写一份toolChain放在一个地方,就可以给所有工程使用。
4. 如何使用cmake编译软件项目3
1. 在主程序所在目录的CMakeLists.txt中定义要编译的主程序和输出的可执行文件名:
#定义主程序名称
add_executable(输出的可执行文件名称 源文件列表)
#定义链接库
target_link_libraries(输出的可执行文件名称 链接库1 链接库2 ...)
2.在库文件所在目录中的CMakeLists.txt中告诉cmake将其所有库文件编译成动态库:
#通过set命令自定义变量LIB_SRC包括那些源文件,这些文件将编译到动态库
set (LIB_SRC
libsrc1.cpp
libsrc2.cpp
libsrc3.cpp
)
#将上述文件编译到库中
add_library (库名称 SHARED ${LIB_SRC})
#定义库的输出位置, 如果在根目录下的CMakeLists.txt中已经定义,此处可注释掉。
set(LIBRARY_OUTPUT_PATH 具体的目录位置)
5. ubuntu源码编译安装cmake-2.8.10.2
ubuntu源码编译安装cmake-2.8.10.2从cmake官网下载最新的cmake版本,笔者下载的是cmake-2.8.10.2.tar.gz,地址http://www.cmake.org/cmake/resources/software.html
www.dnjsb.com
1、解压cmake-2.8.10.2.tar.gztar
-xvf
cmake-2.8.10.2.tar.gz2、在cmake-2.8.10.2同级目录下新建一个编译目录mkdir
cmake-bulidcd
cmake-build3、编译cmake.././bootstrap
www.dnjsb.com
注意:可能会出现如下错误:/usr/lib/libstdc++.so.6:
version
'GLIBCXX_3.4.15'
not
found这个是因为笔者更新ubuntu
gcc编译器导致的。解决方法:a.
查看libstdc++.so.6支持GLIBCstrings
/usr/lib/libstdc++.so.6
|
grep
GLIBCoutput:GLIBCXX_3.4GLIBCXX_3.4.1GLIBCXX_3.4.2GLIBCXX_3.4.3GLIBCXX_3.4.4GLIBCXX_3.4.5GLIBCXX_3.4.6GLIBCXX_3.4.7GLIBCXX_3.4.8GLIBCXX_3.4.9GLIBCXX_3.4.10GLIBCXX_3.4.11GLIBCXX_3.4.12GLIBCXX_3.4.13GLIBC_2.0GLIBC_2.3GLIBC_2.1GLIBC_2.1.3GLIBC_2.3.2GLIBC_2.2GLIBCXX_FORCE_NEWGLIBCXX_DEBUG_MESSAGE_LENGTH发现里面没有支持GLIBCXX_3.4.15。在这里,笔者ubuntu中安装的gcc
4.7ls
/usr/local/gcc-4.7.2/output:bin
include
lib
libexec
share将/usr/local/gcc-4.7.2/lib/目录下面的libstdc++.so.6和libstdc++.so.6.0.17拷贝到/usr/lib/目录下面:sudo
cp
/usr/local/gcc-4.7.2/lib/libstdc++.so.6
/usr/lib/sudo
cp
/usr/local/gcc-4.7.2/lib/libstdc++.so.6.0.17
/usr/lib/sudo
rm
-f
/usr/lib/libstdc++.so.6.0.13删除libstdc++.so.6旧的链接,建立新的链接,同时删除libstdc++.so.6.0.13:sudo
ln
-sf
/usr/lib/libstdc++.so.6.0.17
/usr/lib/libstdc++.so.6sudo
rm
-f
/usr/lib/libstdc++.so.6.0.13至此搞定,现在我们回到编译cmake中。重复刚才的命令:
www.dnjsb.com
.././bootstrap注意:此时我们仍然在cmake-bulid目录下面。上面成功以后就执行如下2个命令:makesudo
make
install查看cmake是否安装成功:cmake
--versionoutput:cmake
version
2.8.10.2恭喜你,安装成功了。
6. 如何运行cmake编译后的c代码
你机子的某个盘里建一个新的文件夹,如我这里的完整路径是:D:\CMake\CMake-Study\HelloCMake;
然后在HelloCMake文件夹里建立一个HelloCMake.cpp文件,里面的代码如下:
#include
int
main()
{
std::cout