рд╕реА / рд╕реА ++ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдпред рднрд╛рдЧ реи

рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рдареНрдпрдХреНрд░рдо "C ++ рдбреЗрд╡рд▓рдкрд░" рдХреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



тЖТ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдкрдврд╝реЗрдВ



рдЕрд╕реЗрдВрдмрд▓реА рдлрд╝реЛрд▓реНрдбрд░ рдЬрд╛рдирдХрд╛рд░реА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ


рдпрджрд┐ рд╕рдорд╛рди рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрднреА-рдХрднреА рдлрд╝реЛрд▓реНрдбрд░ рдЬрд╛рдирдХрд╛рд░реА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  • рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ __FILE__ рдореИрдХреНрд░реЛред
  • рдбрд┐рдмрдЧ рдмрд╛рдпрдиреЗрд░реА рдмрдирд╛рдПрдВ рдЬреЛ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред

MacOS рдкрд░ рдЕрдкрдиреЗ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рд╕реНрд░реЛрдд рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЕрдВрддрд┐рдо рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдкрд░ рд╕реНрдерд╛рди рдХрд╛ рдкреНрд░рднрд╛рд╡ рджрд┐рдЦрд╛ рд╕рдХреЗрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдиреАрдЪреЗ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧреАред

 . тФЬтФАтФА run_build.sh тФЬтФАтФА srcA тФВ тФЬтФАтФА CMakeLists.txt тФВ тФЬтФАтФА hello_world.cpp тФВ тФЬтФАтФА hello_world.hpp тФВ тФФтФАтФА main.cpp тФФтФАтФА srcB тФЬтФАтФА CMakeLists.txt тФЬтФАтФА hello_world.cpp тФЬтФАтФА hello_world.hpp тФФтФАтФА main.cpp 

рдЪрд▓реЛ рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ рд╣рдорд╛рд░реА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВред

 cd srcA/build cmake -DCMAKE_BUILD_TYPE=Debug .. make cd .. && cd .. cd srcB/build cmake -DCMAKE_BUILD_TYPE=Debug .. make cd .. && cd .. md5sum srcA/build/hello md5sum srcB/build/hello md5sum srcA/build/CMakeFiles/HelloLib.dir/hello_world.cpp.o md5sum srcB/build/CMakeFiles/HelloLib.dir/hello_world.cpp.o md5sum srcA/build/libHelloLib.a md5sum srcB/build/libHelloLib.a     : 3572a95a8699f71803f3e967f92a5040 srcA/build/hello 7ca693295e62de03a1bba14853efa28c srcB/build/hello 76e0ae7c4ef79ec3be821ccf5752730f srcA/build/CMakeFiles/HelloLib.dir/hello_world.cpp.o 5ef044e6dcb73359f46d48f29f566ae5 srcB/build/CMakeFiles/HelloLib.dir/hello_world.cpp.o dc941156608b578c91e38f8ecebfef6d srcA/build/libHelloLib.a 1f9697ef23bf70b41b39ef3469845f76 srcB/build/libHelloLib.a 

рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЕрдВрддрд┐рдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдЕрдкреВрд░рдгреАрдп рдмрдирд╛рддреА рд╣реИред рд╣рдо рдПрдХ рдбрд┐рдлрд░реЗрдВрд╕реНрдХреЛрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдЬрд╛рдирдХрд╛рд░реА рдХрд╣рд╛рдБ рдПрдореНрдмреЗрдбреЗрдб рд╣реИред

 > diffoscope helloA helloB --- srcA/build/hello +++ srcB/build/hello @@ -1282,20 +1282,20 @@ ... 00005070: 5f77 6f72 6c64 5f64 6562 7567 2f73 7263 _world_debug/src -00005080: 412f 006d 6169 6e2e 6370 7000 2f55 7365 A/.main.cpp./Use +00005080: 422f 006d 6169 6e2e 6370 7000 2f55 7365 B/.main.cpp./Use 00005090: 7273 2f63 6172 6c6f 732f 446f 6375 6d65 rs/carlos/Docume 000050a0: 6e74 732f 6465 7665 6c6f 7065 722f 7265 nts/developer/re 000050b0: 7072 6f64 7563 6962 6c65 2d62 7569 6c64 producible-build 000050c0: 732f 7361 6e64 626f 782f 6865 6c6c 6f5f s/sandbox/hello_ -000050d0: 776f 726c 645f 6465 6275 672f 7372 6341 world_debug/srcA +000050d0: 776f 726c 645f 6465 6275 672f 7372 6342 world_debug/srcB 000050e0: 2f62 7569 6c64 2f43 4d61 6b65 4669 6c65 /build/CMakeFile 000050f0: 732f 6865 6c6c 6f2e 6469 722f 6d61 696e s/hello.dir/main 00005100: 2e63 7070 2e6f 005f 6d61 696e 005f 5f5a .cpp.o._main.__Z ... @@ -1336,15 +1336,15 @@ ... 000053c0: 6962 6c65 2d62 7569 6c64 732f 7361 6e64 ible-builds/sand 000053d0: 626f 782f 6865 6c6c 6f5f 776f 726c 645f box/hello_world_ -000053e0: 6465 6275 672f 7372 6341 2f62 7569 6c64 debug/srcA/build +000053e0: 6465 6275 672f 7372 6342 2f62 7569 6c64 debug/srcB/build 000053f0: 2f6c 6962 4865 6c6c 6f4c 6962 2e61 2868 /libHelloLib.a(h 00005400: 656c 6c6f 5f77 6f72 6c64 2e63 7070 2e6f ello_world.cpp.o 00005410: 2900 5f5f 5a4e 3130 4865 6c6c 6f57 6f72 ).__ZN10HelloWor ... 

рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди


рдлрд┐рд░, рдирд┐рд░реНрдгрдп рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрдХрд▓рдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛:

  • msvc рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЪрд░рдг рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдорд░рдореНрдордд рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЪреВрдВрдХрд┐ рд╣рдо рдкреНрд░рдЬрдирди рдпреЛрдЧреНрдп рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ рд╡рд░реНрдгреЛрдВ рдореЗрдВ рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
  • рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП gcc рдХреЗ рддреАрди рд╕рдВрдХрд▓рдХ рдЭрдВрдбреЗ рд╣реИрдВ:
    • -fdebug-prefix-map=OLD=NEW рдбрд┐рдмрдЧ рд╕реВрдЪрдирд╛ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЙрдкрд╕рд░реНрдЧ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
    • -fmacro-prefix-map=OLD=NEW рдЙрдкрд▓рдмреНрдз рд╣реИ рдЪреВрдВрдХрд┐ gcc 8 рдФрд░ __FILE__ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ irreproducibility рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
    • -ffile-prefix-map=OLD=NEW gcc 8 рдХреЗ рдмрд╛рдж рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдпрд╣ рдПрдХ -fdebug-prefix-map рдФрд░ -fmacro-prefix-map рдХрд╛ рдПрдХ рд╕рдВрдШ рд╣реИ
  • -fdebug-prefix-map=OLD=NEW clang 3.8 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рд╕реЗ -fdebug-prefix-map=OLD=NEW рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрдиреНрдп рдЭрдВрдбреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдЭрдВрдбреЗ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред CMake рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп:

 target_compile_options(target PUBLIC "-ffile-prefix-map=${CMAKE_SOURCE_DIR}=.") 

рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдХреНрд░рдо


рдпрджрд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдирдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдХреНрд░рдо рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рдПрдХ рдирд┐рдпрддрд╛рддреНрдордХ рдЖрджреЗрд╢ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░реАрдбрд┐рд░ () рдФрд░ рд▓рд┐рд╕реНрдЯрд┐рд░ () рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕рд┐рд╕реНрдЯрдо рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд▓рд┐рдВрдХрд░ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрдЬрдЧрд░ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ), рдЬреЛ рдПрдХ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рдХреНрд░рдо рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╣рд░ рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛, рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИ рдЬрд╛рдПрдВрдЧреАред

рд╣рдо CMake рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 . тФЬтФАтФА CMakeLists.txt тФЬтФАтФА CMakeListsA.txt тФЬтФАтФА CMakeListsB.txt тФЬтФАтФА hello_world.cpp тФЬтФАтФА hello_world.hpp тФЬтФАтФА main.cpp тФЬтФАтФА sources0.cpp тФЬтФАтФА sources0.hpp тФЬтФАтФА sources1.cpp тФЬтФАтФА sources1.hpp тФЬтФАтФА sources2.cpp тФФтФАтФА sources2.hpp 

рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рд╣рдо CMakeLists.txt рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рд╕рдВрдХрд▓рди рдкрд░рд┐рдгрд╛рдо рдЕрд▓рдЧ рд╣реИрдВ:

 cmake_minimum_required(VERSION 3.0) project(HelloWorld) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_library(HelloLib hello_world.cpp sources0.cpp sources1.cpp sources2.cpp) add_executable(hello main.cpp) target_link_libraries(hello HelloLib) 

рдпрджрд┐ рд╣рдо A рдФрд░ B рдирд╛рдо рд╕реЗ рджреЛ рд▓рдЧрд╛рддрд╛рд░ рдЕрд╕реЗрдВрдмрд▓реА рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ sources0.cpp рдХреА sources0.cpp sources1.cpp рд╣реБрдП, sources1.cpp рдХреА sources0.cpp sources1.cpp ред sources1.cpp рдХреА рд╕реВрдЪреА рдореЗрдВ sources0.cpp рдФрд░ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреЗрдХрд╕рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

 30ab264d6f8e1784282cd1a415c067f2 helloA cdf3c9dd968f7363dc9e8b40918d83af helloB 707c71bc2a8def6885b96fb67b84d79c hello_worldA.cpp.o 707c71bc2a8def6885b96fb67b84d79c hello_worldB.cpp.o 694ff3765b688e6faeebf283052629a3 sources0A.cpp.o 694ff3765b688e6faeebf283052629a3 sources0B.cpp.o 0db24dc6a94da1d167c68b96ff319e56 sources1A.cpp.o 0db24dc6a94da1d167c68b96ff319e56 sources1B.cpp.o fd0754d9a4a44b0fcc4e4f3c66ad187c sources2A.cpp.o fd0754d9a4a44b0fcc4e4f3c66ad187c sources2B.cpp.o baba9709d69c9e5fd51ad985ee328172 libHelloLibA.a 72641dc6fc4f4db04166255f62803353 libHelloLibB.a 

рдСрдмреНрдЬреЗрдХреНрдЯ .o рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди .a рд▓рд╛рдпрдмреНрд░реЗрд░реАрдЬрд╝ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдХреНрд░рдо рдЙрд╕ рдХреНрд░рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВред

рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдкреИрджрд╛ рдХреА


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм gcc рдореЗрдВ рд▓рд┐рдВрдХ-рдЯрд╛рдЗрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди ( -flto рдзреНрд╡рдЬ) -flto ред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдирд╛рдореЛрдВ рдХреЛ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ - frandom-seed ред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдПрдХ рдмреАрдЬ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп gcc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рддреАрдХ рдирд╛рдореЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХрд▓рд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рдХрд╡рд░реЗрдЬ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рдЯрд┐рдХрдЯ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪреЗрдХрд╕рдо рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдЯрдХрд░рд╛рд╡ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдХрдо рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CMake рдореЗрдВ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 set(LIB_SOURCES ./src/source1.cpp ./src/source2.cpp ./src/source3.cpp) foreach(_file ${LIB_SOURCES}) file(SHA1 ${_file} checksum) string(SUBSTRING ${checksum} 0 8 checksum) set_property(SOURCE ${_file} APPEND_STRING PROPERTY COMPILE_FLAGS "-frandom-seed=0x${checksum}") endforeach() 

рдХреЙрдирди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдЭрд╛рд╡


рдХреЙрдирди рд╣реБрдХ рд╣рдорд╛рд░реА рдмрд┐рд▓реНрдбреНрд╕ рдХреЛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ pre_build рдЪрд░рдг рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, set_environment рдлрд╝рдВрдХреНрд╢рди рдХреЛ set_environment , рдФрд░ рдлрд┐рд░ post_build рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ reset_environment рдЪрд░рдг рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ reset_environment ред

 def set_environment(self): if self._os == "Linux": self._old_source_date_epoch = os.environ.get("SOURCE_DATE_EPOCH") timestamp = "1564483496" os.environ["SOURCE_DATE_EPOCH"] = timestamp self._output.info( "set SOURCE_DATE_EPOCH: {}".format(timestamp)) elif self._os == "Macos": os.environ["ZERO_AR_DATE"] = "1" self._output.info( "set ZERO_AR_DATE: {}".format(timestamp)) def reset_environment(self): if self._os == "Linux": if self._old_source_date_epoch is None: del os.environ["SOURCE_DATE_EPOCH"] else: os.environ["SOURCE_DATE_EPOCH"] = self._old_source_date_epoch elif self._os == "Macos": del os.environ["ZERO_AR_DATE"] 

post_build рдЪрд░рдг рдореЗрдВ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдг рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ ducible , pefile , pe-parse рдпрд╛ strip-nondeterminism pefile ред рдПрдХ ducible рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкреАрдИ рдмрд╛рдЗрдирд░реА рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реБрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

 class Patcher(object): ... def patch(self): if self._os == "Windows" and self._compiler == "Visual Studio": for root, _, filenames in os.walk(self._conanfile.build_folder): for filename in filenames: filename = os.path.join(root, filename) if ".exe" in filename or ".dll" in filename: self._patch_pe(filename) def _patch_pe(self, filename): patch_tool_location = "C:/ducible/ducible.exe" if os.path.isfile(patch_tool_location): self._output.info("Patching {} with md5sum: {}".format(filename,md5sum(filename))) self._conanfile.run("{} {}".format(patch_tool_location, filename)) self._output.info("Patched file: {} with md5sum: {}".format(filename,md5sum(filename))) ... def pre_build(output, conanfile, **kwargs): lib_patcher.init(output, conanfile) lib_patcher.set_environment() def post_build(output, conanfile, **kwargs): lib_patcher.patch() lib_patcher.reset_environment() 

рдирд┐рд╖реНрдХрд░реНрд╖


рдирд┐рдпрддрд╛рддреНрдордХ рдЕрд╕реЗрдВрдмрд▓реА рдПрдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдп рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдЯреВрд▓рдХрд┐рдЯ рд╕реЗ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрд╣ рдкрд░рд┐рдЪрдп рдирд┐рдпрддрд┐рд╡рд╛рдж рдХреА рдХрдореА рдХреЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдгреЛрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ред

рд╕рдВрджрд░реНрдн


рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА



рдЙрдкрдХрд░рдг


рдмрд╛рдЗрдирд░реА рддреБрд▓рдирд╛ рдЙрдкрдХрд░рдг


рдлрд╝рд╛рдЗрд▓ рдорд░рдореНрдордд рдЙрдкрдХрд░рдг


рдлрд╛рдЗрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг


тЖТ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдкрдврд╝реЗрдВ

Source: https://habr.com/ru/post/hi468555/


All Articles