C++编译每次都很慢,即使我不更改源代码
C++ compiling is very slow every time even though I don't change source code
我可以容忍第一次构建。但是每次编译都很慢,即使我不更改任何源代码。这就是我想解决的问题。
这是我的编译选项。我使用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"
}
我怀疑两件事:
- g++ 命令每次都会编译所有代码。
- 提升可能是原因。预编译库可能会有所帮助。(*)
我发现在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++生态系统,在使用依赖项时具有兼容性的优势。
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- 在构建时从源代码编译 OpenCV 3
- 更改 Cmake 文件以从源代码编译依赖项,而不是使用 FIND_PACKAGE
- 节点C++源代码编译错误
- 在 Windows 10 上从源代码编译 libcurl 7.61.1
- 如何使用HDF5源代码编译c程序
- 如何将混合(asm,C++)源代码编译为32位程序
- C++使用 MATLAB 引擎和 g++ 进行源代码编译
- 从源代码编译 openCV:*** 未指定目标,也未找到生成文件.停
- 如何将Paraview源代码编译到QT项目(.pro)
- 从 ARM 源代码编译 Qt 4.7 的问题
- 我应该从源代码编译一个库吗
- ' /usr/lib/i386-linux-gnu/qt5/bin/lrelease: 未找到 警告:目标为空' 尝试从源代码编译 Feathercoin 时出错
- gcc|从源代码编译有问题
- 如何从源代码编译使用头文件的应用程序
- 安卓源代码编译问题
- 从源代码编译后未安装 Boost ptr_container库
- 有没有一种方法可以将C++源代码编译成二进制文件,以便gdb可以看到它
- 在线JTAG/RGH源代码编译时错误
- 无法在Mac OS X Lion上使用Alchemy将c++源代码编译为swc