$ time foo
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$
Run Code Online (Sandbox Code Playgroud)
"真实","用户"和"系统"在时间输出中意味着什么?
在对我的应用进行基准测试时哪一个有意义?
我试图为此刷新GCC手册页,但仍然没有得到它,真的.
-march和之间有什么区别-mtune?
什么时候才使用-march,而不是两者兼而有之?是否有可能只是-mtune?
我正在尝试追踪我在Linux下调试的应用程序中的性能瓶颈的原因.所涉及的各种过程似乎要花费大量的时间阻塞I/O请求,我想知道是否有人知道任何Linux的技巧,让你看到为什么一个特定的过程被阻断/什么资源它是在等待什么?/proc例如,有什么用处吗?
我安装了多个版本的Visual Studio(2010,2012,2015试用版).
如何强制CMake为特定的VS版本生成makefile?默认情况下,它为VS2015生成.
我的项目包含几个共享一些常用代码的可执行文件.我想将公共代码放在可执行文件可以链接到的静态库中.(公共代码非常小,我不想处理共享库).
源树看起来像这样:
app1和app2都依赖于共同的代码.
此公共代码非常特定于应用程序,并且永远不需要由此目录树之外的其他项目使用.出于这个原因,我宁愿不在任何类型的全球位置安装库.
顶级CMakeLists.txt文件只是添加子目录:
project(toplevel)
cmake_minimum_required(VERSION 3.1)
add_subdirectory(common)
add_subdirectory(app1)
add_subdirectory(app2)
Run Code Online (Sandbox Code Playgroud)
公共库的CMakeLists.txt文件创建静态库并设置包含目录:
add_library(common STATIC common.cpp)
target_include_directories(common PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")
Run Code Online (Sandbox Code Playgroud)
可执行文件的文件如下所示:
project(app1)
cmake_minimum_required(VERSION 3.1)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} common)
Run Code Online (Sandbox Code Playgroud)
现在我的问题.如果我从顶级项目目录运行CMake,我可以构建app1和app2并且它们可以成功构建.但是,如果我想构建这些项目中的单个项目(例如,通过从app1运行CMake)而不是从顶级目录构建,我会收到错误,因为common/include它没有添加到标题搜索路径中.
我明白为什么会这样.用于app1或app2的CMakeLists.txt文件中没有任何内容可以"拉入"常见内容.这只在顶层完成.
有没有解决方法,或者这种行为通常被认为是可接受的?关于我的设置是次优的吗?我只是觉得能够在我们开始开发越来越多使用这个公共库的可执行文件的情况下单独构建项目而不是从顶级构建项目会很好,但也许这是我不应该做的事情.关心.
我最近遇到了几个关于改善CMake启用C++项目周转时间的具体方面的问题(比如"我应该在什么级别分配我的构建过程?"或"cmake rebuild_cache 只是一个子目录?"),我是想知道是否有更一般的指导利用CMake提供的特定可能性.如果可能没有跨平台编译时优化,我主要对Visual Studio或基于GNU toochain的方法感兴趣.
我已经意识到并投资了一般推荐的领域来加速C++构建:
更改/优化/微调工具链
优化您的代码库/软件架构(例如,通过减少依赖关系并使用明确定义的子项目 - 单元测试)
投资更好的硬件(SSD,CPU,内存)
喜欢在这里,这里或这里推荐.所以我在这个问题上的重点是第一点.
另外我知道在CMake的Wiki中可以找到的建议:
前者只处理基础(并行make),后者主要处理如何加速解析CMake文件.
为了使这更具体一点,如果我从这里使用MSYS/GNU的100个库获取我的CMake示例,我得到了以下time测量结果:
$ cmake --version
cmake version 3.5.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
$ time -p cmake -G "MSYS Makefiles" ..
-- The CXX compiler identification is GNU 4.8.1
...
-- Configuring done
-- Generating done
-- Build files have been written to: [...]
real 27.03
user …Run Code Online (Sandbox Code Playgroud) 我有几个项目(所有建筑都使用来自相同源树结构的CMake)都使用他们自己的混合数十个支持库.
所以我想到了如何在CMake中正确设置这个问题.到目前为止,我只发现CMake如何正确地创建目标之间的依赖关系,但我仍然在设置所有具有全局依赖关系(项目级别确实知道所有)或本地依赖关系(每个子级别目标仅处理其自己的依赖).
这里是我的目录结构的简化例子,我现在想出了使用CMake和本地依赖性(例子中只有一个可执行的项目,App1但也有更多的实际,App2,App3等):
Lib
+-- LibA
+-- Inc
+-- a.h
+-- Src
+-- a.cc
+-- CMakeLists.txt
+-- LibB
+-- Inc
+-- b.h
+-- Src
+-- b.cc
+-- CMakeLists.txt
+-- LibC
+-- Inc
+-- c.h
+-- Src
+-- c.cc
+-- CMakeLists.txt
App1
+-- Src
+-- main.cc
+-- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
LIB /力霸/的CMakeLists.txt
include_directories(Inc ../LibC/Inc)
add_subdirectory(../LibC LibC)
add_library(LibA Src/a.cc Inc/a.h)
target_link_libraries(LibA LibC)
Run Code Online (Sandbox Code Playgroud)
LIB/LibB /的CMakeLists.txt
include_directories(Inc)
add_library(LibB Src/b.cc Inc/b.h)
Run Code Online (Sandbox Code Playgroud)
LIB /的LibC /的CMakeLists.txt
include_directories(Inc ../LibB/Inc)
add_subdirectory(../LibB LibB)
add_library(LibC …Run Code Online (Sandbox Code Playgroud) 我有一个产生库的项目:
project (myCoolLibrary)
ADD_LIBRARY(my_cool_library SHARED ${mysources_SRC})
Run Code Online (Sandbox Code Playgroud)
另一个应该使用这个库的项目:
find_package (myCoolLibrary REQUIRED)
INCLUDE_DIRECTORIES("${myCoolLibrary_INCLUDE_DIRS}" )
add_executable(myCoolExe ${my_sources_SRC} )
TARGET_LINK_LIBRARIES(myCoolExe ${myCoolLibrary_LIBRARIES} )
Run Code Online (Sandbox Code Playgroud)
有没有办法可以更改第一个文件,以便第二个文件自动运行?通过在第一个文件上运行CMake然后在输出上运行make,然后在第二个文件上运行CMake,CMake能够找到包吗?
我只是将第一个项目的构建地址提供给第二个包的答案也是可以接受的.
cmake ×5
benchmarking ×1
c++ ×1
compilation ×1
debugging ×1
flags ×1
gcc ×1
gnu-make ×1
linux ×1
nmake ×1
optimization ×1
options ×1
performance ×1
process ×1
time ×1
unix ×1
version ×1
visual-c++ ×1