C++编译每次都很慢,即使我不更改源代码

C++ compiling is very slow every time even though I don't change source code

本文关键字:源代码 编译 C++      更新时间:2023-10-16

我可以容忍第一次构建。但是每次编译都很慢,即使我不更改任何源代码。这就是我想解决的问题。

这是我的编译选项。我使用Visual Studio Code。

{
"version": "0.1.0",
"command": "g++",
"isShellCommand": true,
"args": ["-std=c++11", "-stdlib=libc++", "-O2", "-l", "ssl", "-l", "crypto", "-L", "/usr/local/opt/openssl/lib", "-L", "/usr/local/lib", 
"-l", "secp256k1", "-l", "boost_filesystem", "-l", "boost_system", "-l", "boost_thread", "-l", "boost_program_options",
"-I", "/usr/local/opt/openssl/include", "-o", "cp-tx-parser", "-g", "-D", "COPYRIGHT_HOLDERS", "-D", "MAC_OSX",
"main.cpp", "rawtransaction.cpp", "univalue.cpp", "univalue_read.cpp", "amount.cpp", "utilstrencodings.cpp", "uint256.cpp", "ripemd160.cpp",
"sha256.cpp", "sha512.cpp", "hmac_sha512.cpp", "hash.cpp", "pubkey.cpp", "transaction.cpp", "script.cpp", "core_read.cpp", "core_write.cpp", "base58.cpp",
"standard.cpp", "interpreter.cpp", "script_error.cpp", "cleanse.cpp", "utilmoneystr.cpp", "sha1.cpp", "chainparams.cpp", "chainparamsbase.cpp",
"merkle.cpp", "protocol.cpp", "netbase.cpp", "sync.cpp", "key.cpp", "arith_uint256.cpp", "pagelocker.cpp", "random.cpp", "util.cpp",
"utiltime.cpp", "block.cpp"
],
"showOutput": "always"
}

我怀疑两件事:

  1. g++ 命令每次都会编译所有代码。
  2. 提升可能是原因。预编译库可能会有所帮助。(*)

我发现在make命令之前只能编译更新的文件。我现在正在研究它。

(*)

如何加快 g++ 编译时间(使用大量模板时)


更新1

你用的是什么构建系统?作者:Xaxxon

在这里。我正在使用 MacOS。似乎 gcc 和 g++ 是相同的。

$ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$ g++ -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

更新2

我刚开始阅读以下名为"自动工具"的书。我不熟悉诸如make或configure之类的编译术语。似乎解决这个问题还有很长的路要走。但我会的。

https://www.nostarch.com/autotools.htm


更新 3

我也打算在这个周末阅读有关制作之类的文章。

https://www.gnu.org/software/make/manual/make.pdf http://www.oreilly.com/openbook/make3/book/index.csp

和 cmake 作为 xaxxon 推荐。


更新 4

自己制作文件比我预期的要困难得多。我看到了另一种方式。我使用带有c/c ++扩展的Visual Studio Code。编译很好,但每次都非常慢,正如我提到的。但是,似乎vscode可以输出一个生成文件。我正在看看路。

如何设置 VSCode 来编译C++代码?


更新 5

作为比较工具的结果;纯make,autotools和cmake,我决定使用cmake。我现在正在努力添加库。

CMakeList.txt

cmake_minimum_required(VERSION 2.8)
include_directories(/usr/include /usr/local/include /usr/local/opt/openssl/include)
link_directories(/usr/local/lib /usr/local/opt/openssl/lib)
add_library(ssl crypto secp256k1 boost_filesystem boost_system boost_thread boost_program_options)
add_definitions(-DCOPYRIGHT_HOLDERS -DMAC_OSX)
add_definitions("-std=c++11") 
add_executable(cp-tx-parser
main.cpp
rawtransaction.cpp
univalue.cpp
.
.
.
utiltime.cpp
block.cpp
)

错误信息

$ cmake .
CMake Error at CMakeLists.txt:4 (add_library):
Cannot find source file:
crypto
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx

更新 6

问题解决了。 我仍然不确定 CMake,但增量编译效果很好。谢谢大家。

cmake_minimum_required(VERSION 2.8)
add_definitions("-std=c++11") 
# BOOST
set(Boost_INCLUDE_DIR /usr/local/include)
set(Boost_LIBRARY_DIR /usr/local/lib)
find_package(Boost COMPONENTS system filesystem thread program_options REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})
# OpenSSL
set(OPENSSL_ROOT_DIR /usr/local/opt/openssl)
set(OPENSSL_LIBRARY_DIR /usr/local/opt/openssl/lib)
set(OPENSSL_INCLUDE_DIR /usr/local/opt/openssl/include)
find_package(OPENSSL COMPONENTS crypto REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIR})
link_directories(${OPENSSL_LIBRARY_DIR})
# secp256k1
set(Secp256k1_LIBRARY_DIR /usr/local/lib)
add_executable(cp-tx-parser
main.cpp
univalue.cpp
.
.
.
transaction.cpp
amount.cpp
univalue_write.cpp
)
target_link_libraries(cp-tx-parser ${OPENSSL_LIBRARIES})
target_link_libraries(cp-tx-parser ${Boost_LIBRARIES})
target_link_libraries(cp-tx-parser ${Secp256k1_LIBRARY_DIR}/libsecp256k1.a)

你可以使用Xmake,它非常快,它有一个内置的缓存系统,分布式编译系统。

它还提供了一个内置的包管理器。您可以轻松快速地集成许多 c++ 依赖项。

正如彼得所说:

编译器是愚蠢的野兽 - 通过在单个参数列表中列出所有文件,您告诉编译器重新编译所有文件。编译器是愚蠢的野兽,如果你告诉他们一次编译所有内容,这正是他们所做的。查找"增量构建"。这涉及单独编译每个编译单元,仅重新编译受更改影响的单元,然后链接。

你想要一个构建系统,它(除其他外)通常负责实现增量构建。你可以研究的一些构建系统是Ninja和(如果你在Windows上),Visual Studio。制造和自动化工具也可以工作,但来自更古老的时代。我不了解自动工具,但是虽然制造已经改进并且正在改进,但像Ninja这样的较新的构建系统具有较少历史包袱的特权。就像人们在评论中所说的那样,我建议使用 cmake,这是一个构建词干生成器。您配置它,它将为许多 acutal 构建系统生成配置文件,包括我上面列出的所有系统(自动工具除外)。CMake 广泛用于C++生态系统,在使用依赖项时具有兼容性的优势。