
<span id="contentlabels" style="font-size:14px;"><p>目录</p><p><br /></p><p>官网查阅</p><p><br /></p><p>开胃菜例子</p><p><br /></p><p>CMakeLists生成和添加依赖库</p><p><br /></p><p>1、目录结构</p><p><br /></p><p>2、CMakeLists.txt</p><p><br /></p><p>3、configure and generate</p><p><br /></p><p>4、截图:</p><p><br /></p><p>5、其他设置</p><p><br /></p><p>add_library(生成库),target_link_libraries(生成目标连接的库),set_target_properties</p><p><br /></p><p>CMAKE 添加编译选项|-g编译参数/选项</p><p><br /></p><p>包含文件的的目录include_directories</p><p><br /></p><p>CMake设置编译参数/选项</p><p><br /></p><p>如何在cmakelists中加入-ldl编译选项</p><p><br /></p><p>CMake指定gcc,g++版本编译</p><p><br /></p><p>CMake 关闭警告的方法</p><p><br /></p><p>关闭编译器优化</p><p><br /></p><p>Debug和Release 方案</p><p><br /></p><p>About table</p><p><br /></p><p>About question</p><p><br /></p><p>CMakeLists 实现动态宏开关</p><p><br /></p><p>去掉编译优化</p><p><br /></p><p>CMake--List用法</p><p><br /></p><p>CmakeLists.txt单行注释和多行注释 </p><p><br /></p><p>官网查阅</p><p>Search — CMake 3.22.0-rc1 Documentation</p><p><br /></p><p>开胃菜例子</p><p>生成一个可执行程序的 CMakeList</p><p><br /></p><p>#添加包含文件的的目录</p><p>include_directories(${cppzmq_INCLUDE_DIR}) </p><p> </p><p>#用${SOURCE_FILES}指定的文件,生成可执行文件sample_project </p><p>add_executable(sample_project ${SOURCE_FILES}) </p><p> </p><p>#生成可执行文件sample_project 需要连接 ${CMAKE_THREAD_LIBS_INIT}指定的库</p><p>target_link_libraries (sample_project ${CMAKE_THREAD_LIBS_INIT}) </p><p> </p><p>生成一个.so动态库的 CMakeList </p><p><br /></p><p>#用${SRC_LISTS}指定的所有的源文件生成一个库,名字叫libsugan</p><p>add_library(libsugan ${SRC_LISTS}) </p><p> </p><p>#生成libsugan库需要链接 ${OpenCV_LIBS}、 ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so、${PROJECT_SOURCE_DIR}/lib/libInuStreams.so</p><p>target_link_libraries(libsugan </p><p> ${OpenCV_LIBS}</p><p> ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so</p><p> ${PROJECT_SOURCE_DIR}/lib/libInuStreams.so</p><p>)</p><p><br /></p><p>原文链接:https://blog.csdn.net/bandaoyu/article/details/115165199</p><p><br /></p><p>CMakeLists生成和添加依赖库</p><p>原文;cmake之生成动态库 - mohist - 博客园</p><p><br /></p><p>1、目录结构</p><p>│ CMakeLists.txt</p><p>│ index.txt</p><p>│ </p><p>├─build</p><p>├─include</p><p>│ hello.h</p><p>│ hi.h</p><p>│ </p><p>└─src</p><p> hello.cxx</p><p> hi.cxx</p><p>2、CMakeLists.txt</p><p>cmake_minimum_required(VERSION 3.1)</p><p><br /></p><p>#项目名</p><p>project(libhello)</p><p><br /></p><p># 1、指定库的目录变量</p><p>set(libhello_src src/hello.cxx)</p><p># 指定头文件搜索路径</p><p>include_directories("${PROJECT_SOURCE_DIR}/include")</p><p><br /></p><p><br /></p><p><br /></p><p># 2、添加库(对应的两个项目)</p><p>add_library( hello_shared SHARED ${libhello_src})</p><p>add_library( hello_static STATIC ${libhello_src})</p><p># 按照一般的习惯,静态库名字跟动态库名字应该是一致的,只是扩展名不同;</p><p># 即:静态库名为 libhello.a; 动态库名为libhello.so ;</p><p># 所以,希望 "hello_static" 在输出时,不是"hello_static",而是以"hello"的名字显示,故设置如下</p><p># SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")</p><p><br /></p><p><br /></p><p># 3、cmake在构建一个新的target时,会尝试清理掉其他使用这个名字的库,</p><p># 因此,在构建libhello.a时,就会清理掉libhello.so.</p><p># 为了回避这个问题,比如再次使用SET_TARGET_PROPERTIES定义 CLEAN_DIRECT_OUTPUT属性。</p><p>SET_TARGET_PROPERTIES (hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)</p><p>SET_TARGET_PROPERTIES (hello_shared PROPERTIES CLEAN_DIRECT_OUTPUT 1)</p><p><br /></p><p><br /></p><p># 4、按照规则,动态库是应该包含一个版本号的,</p><p># VERSION指代动态库版本,SOVERSION指代API版本。</p><p>SET_TARGET_PROPERTIES (hello_static PROPERTIES VERSION 1.1 SOVERSION 1)</p><p>SET_TARGET_PROPERTIES (hello_shared PROPERTIES VERSION 1.1 SOVERSION 1)</p><p><br /></p><p><br /></p><p># 5、若将libhello.a, libhello.so.x以及hello.h安装到系统目录,才能真正让其他人开发使用,</p><p># 本例中,将hello的共享库安装到<prefix>/lib目录;</p><p># 将hello.h安装<prefix>/include/hello目录。</p><p>#INSTALL (TARGETS hello hello_shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)</p><p>#INSTALL (TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)</p><p>#INSTALL (FILES hello.h DESTINATION include/hello)</p><p>3、configure and generate</p><p>xxx/to/path</p><p><br /></p><p>cd build</p><p>cmake ..</p><p>4、截图:</p><p> mac没有电了, 来个Windows10的截图吧:</p><p><br /></p><p><br /></p><p><br /></p><p>5、其他设置</p><p> 若需要指定输出路径,尝试下面的示例指令:</p><p><br /></p><p># 设置VS会自动新建Debug和Release文件夹</p><p>set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)</p><p>set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)</p><p>set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Bin)</p><p><br /></p><p># 设置分别设置Debug和Release输出目录</p><p>set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Lib)</p><p>set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Lib)</p><p>set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}//build/Debug)</p><p><br /></p><p>set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Lib)</p><p>set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Lib)</p><p>set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/Bin)</p><p>简单例子:</p><p><br /></p><p>一、生成.so共享库文件</p><p>下面是我的几个文件:</p><p><br /></p><p>1hello.cpp</p><p><br /></p><p>//hello.cpp</p><p> int Calculate_sum_Of_Two_Number(int x,int y)</p><p>{</p><p> int z=0;</p><p> z=x+y;</p><p> return (z);</p><p>}</p><p><br /></p><p>2hello.hpp</p><p><br /></p><p>//hello.hpp</p><p>#ifndef __HELLO_H</p><p>#define __HELLO_H</p><p>int Calculate_sum_Of_Two_Number(int x,int y);</p><p>#endif</p><p><br /></p><p>3 main.cpp</p><p><br /></p><p>//main.cpp</p><p>#include "hello.hpp"</p><p>#include <stdio.h></p><p>int main(void)</p><p>{</p><p> int a=0,b=0,c=0;</p><p> printf("please input two parameter:");</p><p> scanf("%d",&a);</p><p> scanf("%d",&b);</p><p> c=Calculate_sum_Of_Two_Number(a,b);</p><p> printf("the sum is : %d",c);</p><p> return 0;</p><p>}</p><p><br /></p><p>4 CMakeLists.txt</p><p><br /></p><p>#要求的Cmake最低版本</p><p>CMAKE_MINIMUM_REQUIRED( VERSION 2.8)</p><p> </p><p>#工程名称</p><p>PROJECT(main)</p><p> </p><p>#设置编译器编译模式:</p><p>set( CMAKE_BUILD_TYPE "Debug" )</p><p> </p><p>#生成共享库</p><p>#get the shared package</p><p>#here needs no .hpp</p><p>add_library(calculate_shared SHARED hello.cpp)</p><p> </p><p>#生成可以执行的文件</p><p>add_executable(main main.cpp)</p><p> </p><p>#连接共享库</p><p>target_link_libraries(main calculate_shared)</p><p><br /></p><p>上面CmakeLists.txt里面, 共享库的名称是calculate_shared,这个是我们可以自己更改的。生成的可执行文件是main, 这个名称也是可以更改的。</p><p><br /></p><p>不过需要注意的是,hello.cpp里面不用在包含hello.hpp 了。(汗,因为这个导致出错,提示说是重复定义函数了);</p><p><br /></p><p>编译生成:</p><p><br /></p><p>mkdir build</p><p>cd build</p><p>cmake ..</p><p>make</p><p>我们就可以看到build生成了 如下的文件:</p><p><br /></p><p>CMakeCache.txt cmake_install.cmake main</p><p>CMakeFiles libcalculate_shared.so Makefile</p><p><br /></p><p> libcalculate_shared.so就是生成的共享库文件。</p><p><br /></p><p>他们的路径是:/home/fan/dev/cmake/4-exer/</p><p><br /></p><p>下面有build文件夹,以及main.cpp, hello.cpp, hello.hpp, </p><p><br /></p><p>build文件夹下面有共享库 libcalculate_shared.so.so</p><p><br /></p><p>二、调用共享库文件</p><p><br /></p><p><br /></p><p>所有的外部依赖库都是这样的,比如opencv ,openni, eigen等等,原理是一样的,只不过他们已经安装在系统里面了,可以查找,而这个则是需要我们自己去配置。</p><p><br /></p><p>即我上面生成的共享库文件本质上和opencv的库是相同的。只不过这个共享库需要自己手动配置。</p><p><br /></p><p>比如我又新建了一个工程,需要调用上面的共享库 libcalculate_shared.so。</p><p><br /></p><p>main.cpp如下:</p><p><br /></p><p>//main.cpp</p><p>#include <stdio.h></p><p>#include <iostream></p><p>#include "hello.hpp"</p><p>using namespace std;</p><p>int main(void)</p><p>{</p><p> int x=2,y=3;</p><p> int z=0;</p><p> z=Calculate_sum_Of_Two_Number(x,y);</p><p> cout<<"the result is:"<<z<<endl;</p><p> return 0;</p><p>}</p><p><br /></p><p>那么在CMakeLists.txt里面,我需要告诉CMake, 这个头文件可以在哪里找到,头文件所定义的函数又可以在哪里找到。</p><p><br /></p><p>上面hello.hpp的路径是:/home/fan/dev/cmake/4-exer/hello.hpp</p><p><br /></p><p>libcalculate_shared.so的路径是/home/fan/dev/cmake/4-exer/build/libcalculate_shared.so</p><p><br /></p><p>则CMakeLists.txt如下:</p><p><br /></p><p>CMAKE_MINIMUM_REQUIRED( VERSION 2.8)</p><p> </p><p>PROJECT(main)</p><p>#设置编译器编译模式:</p><p>SET( CMAKE_BUILD_TYPE "Debug" )</p><p> </p><p>SET(HELLO_INCLUE </p><p> /home/fan/dev/cmake/4-exer/)</p><p> </p><p>SET(HELLO_SRC </p><p> /home/fan/dev/cmake/4-exer/build/libcalculate_shared.so)</p><p> </p><p>INCLUDE_DIRECTORIES(${HELLO_INCLUE})</p><p> </p><p>add_executable(main main.cpp)</p><p> </p><p>target_link_libraries(main ${HELLO_SRC})</p><p><br /></p><p>这里要注意一些细节(对于我这个渣渣来说的)</p><p><br /></p><p>1、${ }这种形式代表一个变量,比如上面的,HELLO_INCLUE ,就是我自己定义的一个变量。</p><p><br /></p><p>2、头文件包含到头文件所在的文件夹,即 /home/fan/dev/cmake/4-exer/</p><p><br /></p><p>3、共享库要指明具体的共享库 ,精确到.so</p><p><br /></p><p>其实主要的就是指明这个调用这个共享库的时候,使用的头文件,以及共享库本身所在的位置,然后包含链接就可以了。</p><p><br /></p><p>安装过的共享库(例如opencv)就不用这么麻烦了,因为它的地址都放在了变量里面。</p><p><br /></p><p>Opencv的依赖添加</p><p>比如Opencv, 它的头文件和.so文件都已经放在了系统变量里面,不用向上面自己定义了(上面例子里面的头文件和共享库文件的地址都是我自己设置的)</p><p><br /></p><p>它的CMakeLists.txt如下:</p><p><br /></p><p>find_package(OpenCV REQUIRED)</p><p><br /></p><p>include_directories(${OPENCV_INCLUDE_DIRS})</p><p><br /></p><p>target_link_libraries(MAIN ${OpenCV_LIBS})</p><p><br /></p><p>只需要查找就可以了,OpenCV_LIBS 和 OPENCV_INCLUDE_DIRS 都是系统帮我们已经定义好的,所以比较容易</p><p><br /></p><p>参考博客:</p><p><br /></p><p>1、如何写自己的CmakeLists.txt https://www.cnblogs.com/chaofn/p/10160555.html</p><p><br /></p><p>2、 【OpenCV】使用CMake链接自己路径下面的OpenCV库 https://blog.csdn.net/twt520ly/article/details/81981473</p><p><br /></p><p>原文链接:https://blog.csdn.net/_37761077/article/details/88750711</p><p><br /></p><p>add_library(生成库),target_link_libraries(生成目标连接的库),set_target_properties</p><p>add_library(libsugan ${SRC_LISTS}) #用${SRC_LISTS}生成静态库libsugan</p><p><br /></p><p>target_link_libraries(libsugan #生成静态库libsugan还需链接依赖库${OpenCV_LIBS}…</p><p> ${OpenCV_LIBS}</p><p> ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so</p><p> ${PROJECT_SOURCE_DIR}/lib/libInuStreams.so</p><p>)</p><p><br /></p><p>#上面的配置生成名字为libsugan的静态库,但Linux下对库的存储格式是lib+name.a,所以库libsugan存储出来的结果就是liblibsugan.a,看着很别扭。用下面这句,保证了存储出来的静态库叫做libsugan.a:</p><p><br /></p><p>set_target_properties(libsugan PROPERTIES OUTPUT_NAME "sugan")</p><p><br /></p><p>#但是请千万注意,在整个CmakeLists.txt里</p><p><br /></p><p>#如果想链接生成的这个库必须使用 “add_library(libsugan ${SRC_LISTS})”指明的名字。</p><p>set_target_properties(libsugan PROPERTIES OUTPUT_NAME "sugan")</p><p><br /></p><p>add_executable(demo https://www.eepw.com.cn/zhuanlan/src/main.cpp)</p><p>target_link_libraries(demo libsugan)</p><p><br /></p><p>原例子:</p><p><br /></p><p>add_library,target_link_libraries,set_target_properties,target_link_libraries使用联系_michaelhan3的博客-CSDN博客</p><p><br /></p><p>#工程名字</p><p>project(Camera_sugan) </p><p> </p><p>#编译最低cmake版本</p><p>cmake_minimum_required(VERSION 2.6) </p><p> </p><p>#设置c++编译器</p><p>set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" ) </p><p> </p><p>#在整个电脑上找opencv包</p><p>find_package(OpenCV REQUIRED) </p><p> </p><p>#包含头文件路径</p><p>include_directories( </p><p> https://www.eepw.com.cn/zhuanlan/include/inudev/</p><p> https://www.eepw.com.cn/zhuanlan/src/</p><p>)</p><p> </p><p>#将所有的源文件列为一个集合,集合名字叫做SRC_LISTS</p><p>set(SRC_LISTS </p><p> https://www.eepw.com.cn/zhuanlan/src/inuitive.cpp</p><p> https://www.eepw.com.cn/zhuanlan/src/runCamera_Qfeeltech.cpp</p><p>)</p><p> </p><p>#将集合里的所有的源文件生成一个静态库,该静态库的名字libsugan,</p><p>注意,在整个CmakeLists里都要用libsugan这个</p><p>add_library(libsugan ${SRC_LISTS}) </p><p> </p><p>#名字来代替之前那个集合生成的库。</p><p>target_link_libraries(libsugan #链接静态库需要的依赖库</p><p> ${OpenCV_LIBS}</p><p> ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so</p><p> ${PROJECT_SOURCE_DIR}/lib/libInuStreams.so</p><p>)</p><p><br /></p><p>原文链接:https://blog.csdn.net/michaelhan3/article/details/69568362</p><p><br /></p><p>CMAKE 添加编译选项|-g编译参数/选项</p><p>add_definitions 和add_compile_options,二者添加的编译选项是针对所有编译器的(包括c和c++编译器)。</p><p><br /></p><p>add_definitions 和add_compile_options的区别是:</p><p><br /></p><p>add_definitions 可用于添加任何标志,但旨在添加预处理器定义。</p><p><br /></p><p>此命令已被替代方案取代:</p><p>使用 add_compile_definitions() 添加预处理器定义。</p><p>使用 include_directories() 添加包含目录。</p><p>使用 add_compile_options() 添加其他选项。</p><p><br /></p><p>add_definitions — CMake 3.22.0-rc1 Documentation</p><p><br /></p><p>添加 -g编译参数/选项</p><p><br /></p><p>方法一:add_definitions("-g")/ add_compile_options</p><p><br /></p><p><br /></p><p>在文件 CMakeLists.txt添加下面一条语句</p><p>add_definitions("-g")</p><p><br /></p><p>添加其他编译参数/选项</p><p><br /></p><p>例如下面的代码</p><p><br /></p><p>#判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持</p><p><br /></p><p>if(CMAKE_COMPILER_IS_GNUCXX)</p><p> add_compile_options(-std=c++11)</p><p> message(STATUS "optional:-std=c++11") </p><p>endif(CMAKE_COMPILER_IS_GNUCXX)</p><p> </p><p><br /></p><p><br /></p><p><br /></p><p>使用add_compile_options添加-std=c++11选项,是想在编译c++代码时加上c++11支持选项。但是因为add_compile_options是针对所有类型编译器的,所以在编译c代码时,就会产生如下warning</p><p><br /></p><p>J:workspacefacecl.gcc>make b64</p><p>[ 50%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cdecode.c.obj</p><p>cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C</p><p>[100%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cencode.c.obj</p><p>cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C</p><p>Linking C static library libb64.a</p><p>[100%] Built target b64</p><p>虽然并不影响编译,但看着的确是不爽啊,要消除这个warning,就不能使用add_compile_options,而是只针对c++编译器添加这个option。</p><p><br /></p><p>方法二:set</p><p><br /></p><p>所以如下修改代码,则警告消除。</p><p><br /></p><p>#判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持</p><p>if(CMAKE_COMPILER_IS_GNUCXX)</p><p> set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")</p><p> message(STATUS "optional:-std=c++11") </p><p>endif(CMAKE_COMPILER_IS_GNUCXX)</p><p><br /></p><p><br /></p><p>原文链接:https://blog.csdn.net/qinglongzhan/article/details/80743731</p><p><br /></p><p>包含文件的的目录include_directories</p><p>include_directories(${cppzmq_INCLUDE_DIR}) //添加包含文件的的目录</p><p><br /></p><p>add_definitions 可用于添加任何标志,但旨在添加预处理器定义。</p><p><br /></p><p>此命令已被替代方案取代:</p><p>使用 add_compile_definitions() 添加预处理器定义。</p><p>使用 include_directories() 添加包含目录。</p><p>使用 add_compile_options() 添加其他选项。</p><p><br /></p><p>CMake设置编译参数/选项</p><p>而set命令设置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器的</p><p><br /></p><p>对c编译器的</p><p><br /></p><p>set(CMAKE_C_FLAGS"-O3 -fopenmp -fPIC -Wno-deprecated -Wenum-compare -std=c++14")</p><p><br /></p><p>针对c++编译器的</p><p><br /></p><p>set(CMAKE_CXX_FLAGS "-O3 -fopenmp -fPIC -Wno-deprecated -Wenum-compare -std=c++14")</p><p><br /></p><p>如何在cmakelists中加入-ldl编译选项</p><p>cmakelists.txt中,在增加可执行程序后增加TARGET_LINK_LIBRARIES</p><p>eg:</p><p><br /></p><p><br /></p><p>add_executable(xx ${ALL_F} ${WE_F})</p><p>TARGET_LINK_LIBRARIES(dl)</p><p>TARGET_LINK_LIBRARIES(m)</p><p><br /></p><p>set(CMAKE_C_FLAGS "-ldl")</p><p><br /></p><p>在add_executable(${PROJECT_NAME} "main.cpp")后面添加</p><p>target_link_libraries(${PROJECT_NAME} dl)</p><p><br /></p><p>target_link_libraries(exe1 -Wl, - -whole-archive lib1 -Wl, - no-whole-archive)</p><p>CMake指定gcc,g++版本编译</p><p>系统默认的gcc/g++在/usr/bin目录下。</p><p><br /></p><p>我们升级安装的gcc目录在/usr/local/bin目录下,现在我们希望使用升级后的gcc。</p><p><br /></p><p>通过百度搜索出来的结果,大多是如下操作:</p><p><br /></p><p>在CMakeLists.txt中调用编译器之前添加:</p><p><br /></p><p>1</p><p><br /></p><p>2</p><p><br /></p><p>SET(CMAKE_C_COMPILER "/usr/local/bin/gcc")</p><p><br /></p><p>SET(CMAKE_CXX_COMPILER "/usr/local/bin/g++")</p><p><br /></p><p>然而经过本人亲自实践,该方法不起作用,正确的做法是:</p><p><br /></p><p>执行cmake命令之前,在shell终端先设置如下两个变量:</p><p><br /></p><p>1</p><p><br /></p><p>2</p><p><br /></p><p>export CC=/usr/local/bin/gcc</p><p><br /></p><p>export CXX=/usr/local/bin/g++</p><p><br /></p><p>然后再执行cmake等后续命令,这样就可以用指定的编译器版本了。</p><p><br /></p><p>【已解决】CMake指定gcc,g++版本编译 | 勤奋的小青蛙</p><p><br /></p><p>CMake 关闭警告的方法</p><p>在CMakeLists.txt中添加add_definitions(-w)</p><p><br /></p><p>应用于单个target</p><p><br /></p><p> if(CMAKE_COMPILER_IS_GNUCC)</p><p> target_compile_options(main PRIVATE"-Wall")</p><p> endif()</p><p> if(MSVC)</p><p> target_compile_options(main PRIVATE"/ W4")</p><p> endif()</p><p> </p><p>应用于所有target</p><p><br /></p><p> if(CMAKE_COMPILER_IS_GNUCC)</p><p> set(CMAKE_CXX_FLAGS"$ {CMAKE_CXX_FLAGS} -Wall")</p><p> endif()</p><p> if(MSVC)</p><p> set(CMAKE_CXX_FLAGS"$ {CMAKE_CXX_FLAGS} / W4")</p><p> endif()</p><p> </p><p>注意:为GCC或/ WX添加-Werror以便MSVC将所有警告视为错误。这会将所有警告视为错误。这对于新项目来说可以方便地执行严格的警告。</p><p><br /></p><p>另外, -Wall 并不意味着"所有错误";从历史意义上讲,它意味着"每个人都可以达成一致的所有错误""。从 -Wall -Wextra 开始,然后仔细阅读您的版本的GCC手册,并找到 else 编译器可以为您提供关于警告的信息。</p><p><br /></p><p>CMake和编译器警告 - IT屋-程序员软件开发技术分享社区</p><p><br /></p><p>关闭编译器优化</p><p>(未验证)</p><p><br /></p><p>1)add_compile_options(-fno-elide-constructors) #关闭编译器优化</p><p><br /></p><p>2)set(CMAKE_CXX_FLAGS "-fno-elide-constructors ${CMAKE_CXX_FLAGS}")</p><p><br /></p><p>Debug和Release 方案</p><p>About table</p><p>Configurations in terms of gcc/clang compilers (CMake 3.4.1):</p><p><br /></p><p>Debug: -g</p><p>Release: -O3 -DNDEBUG</p><p>RelWithDebInfo: -O2 -g -DNDEBUG</p><p>MinSizeRel: -Os -DNDEBUG</p><p>It means:</p><p><br /></p><p> +---------------+--------------+--------------+----------+</p><p> | | optimization | assert works | stripped |</p><p> +---------------+--------------+--------------+----------|</p><p> | Debug | no | yes | no |</p><p> | Release | full | no | yes |</p><p> | RelWithDebInfo| good | no | no |</p><p> | MinSizeRel | size | no | yes |</p><p> +---------------+--------------+--------------+----------+</p><p>So I don't agree with your MinSizeRel description because in this case I think both MinSizeRel and Release are stripped.</p><p><br /></p><p>About question</p><p>As far as I understand you want no extra flags at all (no -g, -O* or -DNDEBUG). For Makefile-like generators:</p><p><br /></p><p>> cmake -H. -B_builds -DCMAKE_BUILD_TYPE=MyConf -DCMAKE_CXX_FLAGS_MYCONF=""</p><p>> cmake --build _builds</p><p>CMakeLists 实现动态宏开关</p><p>去掉编译优化</p><p>在CMakeList中添加:</p><p><br /></p><p>if(NOT CMAKE_BUILD_TYPE)</p><p> set(CMAKE_BUILD_TYPE Release)</p><p>endif()</p><p> </p><p>set(CMAKE_CXX_FLAGS "-Wall -Wextra")</p><p>set(CMAKE_CXX_FLAGS_DEBUG "-g")</p><p>set(CMAKE_CXX_FLAGS_RELEASE "-O3")</p><p>执行的时候</p><p><br /></p><p>cmake -DCMAKE_BUILD_TYPE=Release</p><p><br /></p><p>也可以在上一层(调用本CMakeList.txt的)的CMakeList.txt中添加下面:</p><p><br /></p><p>option (CMAKE_BUILD_TYPE "Use tutorial provided math implementation" ON)</p><p><br /></p><p>表示启用CMAKE_BUILD_TYPE 宏。</p><p><br /></p><p>option (CMAKE_BUILD_TYPE "Use tutorial provided math implementation" OFF) #表示关</p><p><br /></p><p>参考:</p><p><br /></p><p>c++ - Optimize in CMake by default - Stack Overflow</p><p><br /></p><p>debugging - How to compile without optimizations -O0 using CMake - Unix & Linux Stack Exchange</p><p><br /></p><p>例子</p><p><br /></p><p>最近在工作中需要通过一份C代码控制逻辑走向,网上找了一下资料,发现可以通过在CMakeLists文件中动态定义宏开关,从而能够达到编译出不同逻辑流的代码。</p><p><br /></p><p>具体步骤:</p><p><br /></p><p>首先,我在src代码里编写了若干debug的输出:</p><p><br /></p><p>#IFDEF DEBUG</p><p> </p><p> some print command;</p><p> </p><p>#ENDIF</p><p>然后,在CMakeLists文件中添加DEBUG的定义:</p><p><br /></p><p>IF (CMAKE_BUILD_TYPE STREQUAL DEBUG)</p><p> ADD_DEFINITIONS(-DDEBUG)</p><p>ENDIF()</p><p>最后,在cmake的时候设置参数 -DCMAKE_BUILD_TYPE 为 DEBUG:</p><p><br /></p><p>$ cmake .. -DCMAKE_BUILD_TYPE=DEBUG</p><p>$ make -j4</p><p>这样再运行可执行文件时就会打印出some print command的debug信息了。如果不想看到debug信息,只需在参数中不设置DEBUG参数,或者将DEBUG参数设置为其它值即可(以下两种方式二者选其一):</p><p><br /></p><p>$ cmake ..</p><p>$ cmake .. -DCMAKE_BUILD_TYPE=RELEASE</p><p>到此 CMakeLists 实现动态宏开关介绍完成。</p><p><br /></p><p>原文链接:https://blog.csdn.net/_19734597/article/details/104461963</p><p><br /></p><p>CMake--List用法</p><p>CMake--List用法 - narjaja - 博客园</p><p><br /></p><p>CmakeLists.txt单行注释和多行注释 </p><p>单行注释:使用“#”</p><p>多行注释:使用“#[[ ]]”</p><p><br /></p><p><img src="https://img-blog.csdnimg.cn/20201004154835219.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NDY3MDgz,size_16,color_FFFFFF,t_70#pic_center" /></p><p>————————————————</p><p>版权声明:本文为CSDN博主「bandaoyu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。</p><p>原文链接:https://blog.csdn.net/bandaoyu/article/details/115165199</p><p><br /></p></span>
<p style="color:#666; padding-top:30px;">*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。</p>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/177883.html