博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

cmake 基础

Posted on 2016-05-21 21:17  bw_0927  阅读(2106)  评论(1)    收藏  举报

find_package( Threads ) calls a CMake module that first, searches the file system for the appropriate threads package for this platform, and then sets the CMAKE_THREAD_LIBS_INIT variable (and some other variables as well). It does not tell CMake to link any executables against whatever threads library it finds. You tell CMake to link you executable against the "Threads" library with the target_link_libraries() command. So, for example lets say your program is called test. To link it against threads you need to:

find_package( Threads )
add_executable( test test.cpp )
target_link_libraries( test ${CMAKE_THREAD_LIBS_INIT} )




对于不清楚的cmake系统变量,可直接查看/usr/share/cmake里对应的源码





PROJECT(project_main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
ADD_SUBDIRECTORY( src )
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

ADD_EXECUTABLE(main ${DIR_SRCS})
TARGET_LINK_LIBRARIES(main Test)

message("PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})

find_package(Threads REQUIRED)
#set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
#set(THREADS_PREFER_PTHREAD_FLAG TRUE)
#set(CMAKE_USE_PTHREADS_INIT TRUE)
if(CMAKE_USE_PTHREADS_INIT)
message("we are using " ${CMAKE_USE_PTHREADS_INIT})
message("we are using " ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries(main_not_exist ${CMAKE_THREAD_LIBS_INIT})
endif()

 

 

只要某个库的名字不存在,或者不一致,就会出现下面奇怪的-lpthreads的编译错误

 

 

 

MakeFiles/cmTC_50d2c.dir/CheckSymbolExists.c.o: In function `main':
CheckSymbolExists.c:(.text+0xc): undefined reference to `pthread_create'
collect2: ld 返回 1
gmake[1]: *** [cmTC_50d2c] 错误 1
gmake[1]: Leaving directory `/home/baiwei/c/cmake_try/CMakeFiles/CMakeTmp'
gmake: *** [cmTC_50d2c/fast] 错误 2

 

/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTC_a8ccc.dir/CheckFunctionExists.c.o -o cmTC_a8ccc -rdynamic -lpthreads
/usr/bin/ld: cannot find -lpthreads
collect2: ld 返回 1
gmake[1]: *** [cmTC_a8ccc] 错误 1
gmake[1]: Leaving directory `/home/baiwei/c/cmake_try/CMakeFiles/CMakeTmp'
gmake: *** [cmTC_a8ccc/fast] 错误 2

 

======================

 

#Q: CPPFLAGS, CFLAGS, CXXFLAGS和LDFLAGS与cmake有什么关联呢?或者这些与shell又有什么关联呢?

#A: Wikipedia:CFLAGS

>CFLAGS and CXXFLAGS are either the name of environmentvariables or of makefile variables that can be set to specify additionalswitches to be passed to a compiler in the process of building computersoftware.

>CFLAGS allows to add switches for the C compiler, whileCXXFLAGS is meant to be used when invoking a c++ compiler. Similarly, avariable CPPFLAGS exists with switches to be passed to the c or c++preprocessor.

Variablesused by implicit rules.

Makefile编译选项CC与CXX/CPFLAGS、CFLAGS与CXXFLAGS/LDFLAGS。

上面这些都是与makefile相关的,都是与make有直接的关系。那么这些变量与cmake有什么关系呢?

[cmake]CFLAGSand CPPFLAGS

Cmake里有变量CMAKE_C_FLAGS和CMAKE_CXX_FLAGS,在shell环境中设置的CFLAGS和CXXFLAGS会被cmake附加。

那我大概清楚了,在linux环境下设置环境变量CFLAGS,CPPFLAGS和CXXFLAGS等等,可直接用于make(可在shell下输入make –p查看);

而在cmake中有CMAKE_C_FLAGS和CMAKE_CXX_FLAGS,这在cmake生成各类工程文件时有用,

在linux环境下设置的CFLAGS和CXXFLAGS环境变量会被cmake分别自动附加到CMAKE_C_FLAGS和CMAKE_CXX_FLAGS中(事实上在windows环境下也可以设置环境变量CFLAGS和CXXFLAGS,这样也能被cmake识别并附加)。

在windows上的mingw/msys环境下,也会自动加载windows设置的所有的环境变量。

注意:在cmake生成某工程后,产生了cmakecache.txt,如果这时候改变环境变量CFLAGS或CXXFLAGS,cmake不会改变CMAKE_C_FLAGS/CMAKE_CXX_FLAGS(除非在cmakelists.txt文件中修改了这个变量),此时只有删除cmakecache.txt,cmake才能应用这些更新。
---------------------
作者:hunterzone
来源:CSDN
原文:https://blog.csdn.net/hunter_wwq/article/details/42265489
版权声明:本文为博主原创文章,转载请附上博文链接!

 

CMAKE_BUILD_TYPE有以下几种: Debug Release RelWithDebInfo MinSizeRel

SET(CMAKE_BUILD_TYPE "Debug")

 

对于C.

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

对于C ++

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")