Tool to check C++ #include dependencies (dependency graphs created in .dot format)

Overview

Read Me for Dependency Checker

Codacy Badge Mac/Linux Build Status Windows Build Status License Release

Copyright (C) 2012-2017, TomTom International BV. All rights reserved.

The tool cpp-dependencies creates #include dependency information for C++ source code files, which it derives from scanning a full source tree.

The dependency information is output as .dot files, which can be visualized in, for example, GraphViz.

Happy coding!

Peter Bindels and Rijn Buve

TomTom International BV

License

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Build and run

The tool depends on Boost.Filesystem being available and usable. Installing this should be done with your platform's package management system, such as Apt, Pacman or Brew.

The build configuration is created with CMake. To create the build configuration for your build system (GNU make, MSBuild/Visual Studio) create a build directory outside this source directory and run

cmake <PATH_TO_THIS_SOURCE_DIR>

If you want to use Boost::Filesystem instead of std::filesystem, if your platform does not have a std::filesystem implementation yet or if you prefer it, add -DWITH_BOOST to the invocation of CMake.

To build the tool, either execute

make

for GNU make or open the Visual Studio solution file generated in the build directory.

This creates the executable file cpp-dependencies.

To check if the tool was compiled correctly, execute:

./cpp-dependencies

This provides help information about the tool. More information about its usage is presented in the next paragraph.

Using cpp-dependencies to analyze a component

As a first thing on a code base is to find out whether it can read the code correctly. From the root of the project, run the command:

cpp-dependencies --stats .

to determine the complexity of the code base and the amount of nodes that are entangled in cycles with other components. In well set-up projects, the cycle count will be equal to zero and the amount of components will be in the same order of size as the logical components you expect.

To investigate a specific component, you can use

cpp-dependencies --info <component> .

for all information the tool has on the component, or:

cpp-dependencies --inout <component> .

to find out who links to and from your component.

In case you have a dependency that you were not expecting, or find out that when rebuilding component A that a supposedly-unrelated component B is built, you can use:

cpp-dependencies --shortest A B .

to determine why there is a link from component A to component B. It will find one of the shortest paths it can find from A to B if there is one.

Using cpp-dependencies to make visualized graphs

The tool is also able to provide output in .dot format, which is a format used by GraphViz and other tools to contain graphs. It is a human-readable format and can be used by the dot tool to convert it into a graphical image. To create a graph file, use:

cpp-dependencies --graph mygraph.dot .

to create a mygraph.dot file containing the full component graph.

You can restrict the component graph to either all components beneath a given target (--graph-for <output> <target>) or all components part of a cycle (--graph-cycles).

To make this text-format graph into a viewable graph, use for example:

dot -Tpng mygraph.dot >mygraph.png

to convert it into a PNG file.

The dot program will try to find a way to graphically display the graph output. Note that very large graphs, in particular if many cycles are present, can take hours to render.

Example use of cpp-dependencies

In the source tree there's a folder example which contains an empty skeleton project, which does have some dependency information to be extracted from it. To start analyzing it, we first run the tool to extract statistics:

> cpp-dependencies --dir example --stats
6 components with 5 public dependencies, 1 private dependencies
Detected 2 nodes in cycles

This informs us that there is something not quite right with the dependencies. It sees 6 components: the root folder, four libraries and an executable. The simplest way to find out what's wrong is to draw out the graph in a visual way:

> cpp-dependencies --dir example --graph dependencies.dot
> dot -Tpng dependencies.dot >dependencies.png

Then open this PNG file in any tool that can view it, such as a web browser. This shows us the following image:

Dependency graph showing a cycle between Engine and UI

The light blue links are an implementation-only link, the dark blue ones expose some part of this dependency on their interface. The orange ones are the most interesting ones; they are places where a component can reach itself through some other component. Let's find out why this is there:

> cpp-dependencies --dir example --shortest Engine UI
Engine -> UI
  ./Engine/Engine.h includes ./UI/Display.h
> cpp-dependencies --dir example --shortest UI Engine
UI -> Engine
  ./UI/Display.cpp includes ./Engine/Engine.h
  ./UI/Display.h includes ./Engine/Engine.h

At this point, it's up to the developer or architect to find out which of these two dependencies is the wrong way around and to find a way around that. In the example, the Engine component should not be talking directly to the UI component. Removing this dependency results in the following statistics:

> cpp-dependencies --dir example --stats
6 components with 4 public dependencies, 2 private dependencies
Detected 0 nodes in cycles

The cycle has been removed, and there is one less dependency. We can find out what the shortest path is to the DataAccess component from the executable:

> cpp-dependencies --dir example --shortest main DataAccess
main -> UI
  ./main/main.cpp includes ./UI/Display.h
UI -> Engine
  ./UI/Display.cpp includes ./Engine/Engine.h
  ./UI/Display.h includes ./Engine/Engine.h
Engine -> DataAccess
  ./Engine/Engine.cpp includes ./DataAccess/DA.h

This tells us that there's no path shorter than three steps, and it informs us for each step of the way why it detects this link. In more complicated cycles, this can be a way to isolate the thinnest part of the cycle. In situations where there's an invalid dependency from one component to another - for example, from a unit test of one component to a very far away different component, this can help you identify where on the path from A to B a wrong link is present. It can also be used to explicitly verify that a link is not present, such as the one we just removed:

> cpp-dependencies --dir example --shortest Engine UI
No path could be found from Engine to UI

The graph now also shows proper dependency ordering:

> cpp-dependencies --dir example --graph newdependencies.dot
> dot -Tpng newdependencies.dot >newdependencies.png

Dependency graph showing no more cycles

We can regenerate the CMakeLists.txt files as well to remove the dependency from the build inputs, so that our build system will also know that the link is no longer present:

> cpp-dependencies --dir example --dryregen
Difference detected at "./Engine"
> cpp-dependencies --dir example --regen

Customizing the outputs

As cpp-dependencies has a lot of analysis it can do on the source tree, there are also some configurable parts to it. The configuration can be found in the file config-cpp-dependencies.txt that should be in your project root. It allows you to customize the colors used in generation, the thresholds for outlier detection and some minor parameters. Please read the documentation in the example config-cpp-dependencies.txt that is in the source distribution for the tool to see all the options.

Editing the tool

The tool itself is split up into a few separate files to make it easier to find and extend its functionality. The following files are found:

  • main.cpp contains the main functions and help information, as well as the core flow.
  • Input.cpp contains the functions that read C++ and CMakeLists files into the information needed by the tool.
  • Output.cpp contains functions to write all output files generated, except for the CMakeLists generation.
  • CmakeRegen.cpp contains the functionality to write CMakeLists files.
  • Analysis.cpp contains all graph processing and navigation functions.
  • Component.cpp contains the implementation needed for the struct-like data storage classes.
  • generated.cpp contains the function to convert found header files into a lookup map. Also the place to add generated files to the known file list, so that they will be taken into account for components.
  • Constants.h contains the constants used throughout the code base.

In general, the root functionality is kept in main.cpp, the structural classes are kept in Component.cpp and any auxiliary functions that are used to do this are split up by domain.

Rationale behind implementation

The tool was implemented with the goal of being able to quickly analyze dependencies between components of a complex project, including how the dependency graph changes when some changes are made to the source tree. To accomplish this, choices were made in the direction of more performance at the expense of strict correctness. Specifically:

  • It does not use a proper C++ parser to read C++ files, nor a proper CMake parser to read CMake files. Properly parsing these files would increase the full run time of the program by orders of magnitude and make it much less useful.
  • strstr is used across the full code base. While profiling, we found that std::string::find was taking over 80% of the full runtime. Replacing it with strstr, which is typically much more optimized, made the whole program twice as fast.

This results in it running on a 1.5GB source code base in about 2.1 seconds -- fast enough for interactive checks and rerunning after any small modification.

The tool was set up to compile on a Ubuntu 12.04 system with the platform default compiler. This means that the sources will use C++11 but will not use anything not available in GCC 4.6. It has been tested and used on Linux (Ubuntu 12.04 - 16.04) and MacOS X (different versions).

Using Git and .gitignore

It's good practice to set up a personal global .gitignore file on your machine which filters a number of files on your file systems that you do not wish to submit to the Git repository. You can set up your own global ~/.gitignore file by executing: git config --global core.excludesfile ~/.gitignore

In general, add the following file types to ~/.gitignore (each entry should be on a separate line): *.com *.class *.dll *.exe *.o *.so *.log *.sql *.sqlite *.tlog *.epoch *.swp *.hprof *.hprof.index *.releaseBackup *~

The local .gitignore file in the Git repository itself to reflect those file only that are produced by executing regular compile, build or release commands.

Bug reports and new feature requests

If you encounter any problems with this library, don't hesitate to use the Issues session to file your issues. Normally, one of our developers should be able to comment on them and fix.

Comments
  • Removing dependency from boost

    Removing dependency from boost

    It's great idea of cpp-dependencies. I think it will be very usefull. I download cpp-dependencies and try to build it at windows, but I haven't got configured boost for it. So I decide remove dependency from boost. It's increase requirements for compiler to vc140 and gcc 5.3, but in cpp-dependencies already used C++11, so I think it possible. Please if you think it will be useful make pull-requests.

    p.s. It my first pull-request at github, so if I made something wrong please correct me.

    opened by ChernovAO 10
  • Assertion failed in src/Input.cpp:304

    Assertion failed in src/Input.cpp:304

    final level of parentheses=-1
    cpp-dependencies: ../src/Input.cpp:304: void ReadCmakelist(const Configuration&, std::unordered_map<std::__cxx11::basic_string<char>, Component*>&, const boost::filesystem::path&): Assertion `parenLevel == 0 || (printf("final level of parentheses=%d\n", parenLevel), 0)' failed.
    Aborted (core dumped)
    
    opened by Warchant 8
  • Be nice to clearly state that you need to be using CMake

    Be nice to clearly state that you need to be using CMake

    The README didn't make it clear to me that it needs CMakeLists.txt to do anything useful. I managed to get it building on WIndows but our code uses MSVC projects so all I got was:

    1 components with 0 public dependencies, 0 private dependencies
    Detected 0 nodes in cycles
    
    opened by toby-allsopp 7
  • Added cmake requirement for C++11

    Added cmake requirement for C++11

    Following the cmake documentation a line declaring C++11 language standard requirement was added. This tells cmake to test the compiler for the language feature, and set the compiler parameters required for the language standard.

    opened by cceelen 5
  • Add CMake build configuration for cpp-dependencies itself

    Add CMake build configuration for cpp-dependencies itself

    I was annoyed by the fact that I had to modify and patch the Visual Studio solution/project files manually each time I tested cpp-dependencies on a different machine or did a clean git checkout. I had to adjust the paths to Boost in two places (include path and library path) as well as I had to switch the toolset (v120 is pre-selected in the solution file, I've only v140 installed) and consequently had to modify the Boost library names.

    I've written simple CMakeLists files to let CMake generate the build instructions (GNU make, MSBuild/Visual Studio). The location of Boost::filesystem (and the implicitly dependent Boost::system) is detected by CMake. People having Boost in a non-default location can use -DBOOST_ROOT=<BOOST_PREFIX_PATH> to tell CMake to preferably search in the given path for Boost headers and libraries. With an optional argument -DWITH_TESTS=OFF one can skip the creation of the unittest target.

    To ease building the unit tests, I've added GTest as a Git submodule and link the unittest target to the gtest_main target.

    The following targets are created for Debug, Release and RelWithDebInfo configurations:

    • cpp_dependencies_obj all source files, except main.cpp
    • cpp-dependencies the actual executable
    • if WITH_TESTS=ON (the default)
      • gtest_main GoogleTest static library
      • unittests cpp-dependencies' unittests

    I have deleted the existing build scripts and solution files.

    I have tested this

    • on a Linux machine (openSUSE 42.1) with CMake 3.6.1, GCC 6.2.1 and Boost 1.54.0
    • on a Windows 7 64bit machine with CMake 3.5, Visual Studio 2015 Update 3 (v140 toolchain) and Boost 1.61.0

    ToDo:

    • [ ] adjust Travis configuration
    opened by torbjoernk 5
  • CMakeLists.txt files in subdirectories are unconditionally included in analysis

    CMakeLists.txt files in subdirectories are unconditionally included in analysis

    CMakeLists.txt files in subdirectories, like those from submodules, are included in analysis regardless of whether they are in the transitive-include graph of the top-level CMakeLists.txt file.

    src/Input.cpp L 267 will pull in any file named CMakeLists.txt.

    This results in misdiagnosis of ambiguous includes in projects like https://github.com/jbcoe/polymorphic_value which include the popular Catch testing framework.

    opened by jbcoe 4
  • --ambiguous includes a symlink to a file as ambiguous to that file

    --ambiguous includes a symlink to a file as ambiguous to that file

    In my test case './include/a.h' is a symbolic link to './src/a.h'. I am getting the following message with '--ambiguous'. I assume there should not be any message.

    Found 1 ambiguous includes
    
    Include for a.h
    Found in : 
      included from ./src/a.cpp
    Options for file: 
      ./include/a.h
      ./src/a.h
    
    
    opened by snandan 4
  • Revisit CI configuration

    Revisit CI configuration

    AppVeyor

    Fix the AppVeyor config to use the right logger, which updates the Web UI with warnings and errors generated during the build. Here is a sample. Upload the built cpp-dependencies installer as an artifact. Here is a sample. TODO: check if the cpp-dependencies standalone executable needs to be added as another artifact.

    Travis

    Fix the unused variable CMAKE_C_COMPILER warning from CMake. EDIT: reverted the language changes in Travis config.

    CMake

    Remove the WITH_TESTS option in favor of the conventional BUILD_TESTING option added by CTest. Add a BUILD_COVERAGE option which changes the compile flags of cpp_dependencies_lib, rather than compiling it twice every time.

    • This addresses the warnings from AppVeyor (MSVC) about the unused compiler flags.
    • It is OFF by default, and is not used by any builds. This can be used later to integrate with a coverage visualization service - codecov or coveralls.
    • Reduces the redundant mention of source files (and one target) in CMakeLists.txt.

    I've kept these changes as independent commits. The ones required can be cherry-picked. If there are concerns, please let me know. I'll try to address them.

    opened by tusharpm 3
  • show snap installation instructions on readme?

    show snap installation instructions on readme?

    i packaged cpp-dependencies as a snap app which should run on almost all linux distros:

    https://snapcraft.io/cpp-dependencies sudo apt install cpp-dependencies on most linux distros

    Snap Status

    opened by gocarlos 2
  • boost dependency necessary for Linux?

    boost dependency necessary for Linux?

    Great tool! The project's README says C++ Boost's Filesystem is necessary, but the file "src/FilesystemInclude.h" gives an alternative("experimental") by a conditional directive. On Linux, there is indeed an "experimental" directory inside GCC's include directory. So is this necessary for Linux? Installing boost seems not a cakewalk (at least for me).

    opened by Leedehai 2
  • Might want to compare with the features in my dependency analyser

    Might want to compare with the features in my dependency analyser

    Just watched the Meeting C++ 2016 video.

    The analyser is a Visual Studio extension / NuGet command line DeepEnds that, for Visual C++, will scan for #include statements or slowly parse with libclang. Output options include an interactive graph file and a set of statistics.

    opened by zebmason 2
  • assertion failed in ReadCmakelist while running cpp-dependencies on itself

    assertion failed in ReadCmakelist while running cpp-dependencies on itself

    Running cpp-dependencies on itself results in a failure:

    ../build/src/cpp-dependencies --stats . final level of parentheses=1 cpp-dependencies: /work/cpp-dep_ws/cpp-dependencies/src/Input.cpp:310: void ReadCmakelist(const Configuration&, std::unordered_map<std::__cxx11::basic_string, Component*>&, const boost::filesystem::path&): Assertion `parenLevel == 0 || (printf("final level of parentheses=%d\n", parenLevel), 0)' failed. Aborted (core dumped)

    opened by callahanp 0
  • Ubuntu 22.10 permission denied error with cpp-dependencies installed via snap

    Ubuntu 22.10 permission denied error with cpp-dependencies installed via snap

    $pwd /work/fg/next/flightgear $ cpp-dependencies --stats terminate called after throwing an instance of 'boost::filesystem::filesystem_error' what(): boost::filesystem::directory_iterator::construct: Permission denied: "." Aborted (core dumped)

    opened by callahanp 0
  • Cannot scan libwebp due to parenthesis level check

    Cannot scan libwebp due to parenthesis level check

    Hi,

    this is follow up of #57 . The fix provided doesn't help for all projects I use. In particular running cpp-dependecies over libwebp causes the issue:

    $ cpp-dependencies --stats
    final level of parentheses=7
    cpp-dependencies: /build/cpp-dependencies/parts/cpp-depenencies/src/src/Input.cpp:310: void ReadCmakelist(const Configuration&, std::unordered_map<std::__cxx11::basic_string<char>, Component*>&, const boost::filesystem::path&): Assertion `parenLevel == 0 || (printf("final level of parentheses=%d\n", parenLevel), 0)' failed.
    Aborted (core dumped)
    

    Project code:

    https://github.com/webmproject/libwebp / tag v1.2.4 (current HEAD also fails)

    It worth noting that before the #61 final level of parentheses was 1 (not 7). And it was possible to overcome the issue by modifying following line in CMakeLists.txt of libwebp:

    405: "AC_INIT\\([^\n]*\\[[0-9\\.]+\\]"
    

    to

    405: "AC_INIT\\([^\n]*\\[[0-9\\.]+\\]\\)"
    

    With recent changes this no longer works.

    opened by RomanValov 4
  • remove experimental deprecation with c++17 in msvc build

    remove experimental deprecation with c++17 in msvc build

    It seemd without it i have an #error from MSVC

    [build] C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include\experimental/filesystem(30,1): fatal error C1189: #error: The <experimental/filesystem> header providing std::experimental::filesystem is deprecated by Microsoft and will be REMOVED. It is superseded by the C++17 <filesystem> header providing std::filesystem. You can define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING to acknowledge that you have received this warning. [D:\p4\cpp-dependencies\build\src\cpp_dependencies_lib.vcxproj]

    opened by simdax 0
  • std::bad_alloc (core dumped) on Ubuntu 16.04

    std::bad_alloc (core dumped) on Ubuntu 16.04

    Build went fine on Ubuntu 16.04 But execution failed /usr/local/bin/cpp-dependencies --stats . terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Aborted (core dumped)

    opened by AlbanAndrieu 0
Releases(1.1)
  • 1.1(Nov 26, 2016)

    This is a fairly major non-breaking change:

    Functionality:

    • Added IncludeSize function, that gives an indication which includes cause your compiler the most grief.
    • Use CMake for the build instead of Makefiles / VS project files.
    • Enable use of std::filesystem, if you have a compiler that has it.

    Speed:

    • More accurate and faster parsing logic.
    • Now using Trajan's algorithm for finding cycles, which makes the cycle analysis much faster. Saves 20% on total runtime on my test target.
    • Enabled use of mmap for reading files.

    Code quality:

    • Fixed various bugs, all resulting in crashes in case of misuse.
    • Fix issues found by PVS-Studio. 19 minors and one critical.
    • Add Appveyor build & Travis build with unit tests, running on Linux, Mac and Windows.
    • Switch testing to simple test framework, to avoid gtest's use troubles on Travis and Appveyor.
    Source code(tar.gz)
    Source code(zip)
  • 1.0(Aug 24, 2016)

Owner
TomTom
TomTom is the location technology provider enabling developers to build applications which are contributing to a safer, cleaner and less congested world.
TomTom
A tool for use with clang to analyze #includes in C and C++ source files

Include What You Use For more in-depth documentation, see docs. Instructions for Users "Include what you use" means this: for every symbol (type, func

null 3.2k Jan 4, 2023
A static analysis tool that helps security researchers scan a list of Windows kernel drivers for common vulnerability patterns in drivers (CVE makers!)

Driver Analyzer A static analysis tool that helps security researchers scan a list of Windows kernel drivers for common vulnerability patterns in driv

BehroozAbbassi 44 Sep 3, 2022
Clang build analysis tool using -ftime-trace

Clang Build Analyzer Clang C/C++ build analysis tool when using Clang 9+ -ftime-trace. The -ftime-trace compiler flag (see blog post or Clang 9 releas

Aras Pranckevičius 716 Dec 25, 2022
A library for enabling task-based multi-threading. It allows execution of task graphs with arbitrary dependencies.

Fiber Tasking Lib This is a library for enabling task-based multi-threading. It allows execution of task graphs with arbitrary dependencies. Dependenc

RichieSams 796 Dec 30, 2022
Source code for the data dependency part of Jan Kossmann's PhD thesis "Unsupervised Database Optimization: Efficient Index Selection & Data Dependency-driven Query Optimization"

Unsupervised Database Optimization: Data Dependency-Driven Query Optimization Source code for the experiments presented in Chapter 8 of Jan Kossmann's

Jan Koßmann 4 Apr 24, 2022
Arduino Conway's Game of Life with MAX7219 with 8x8 Dot Matrix Display

Arduino-GameOfLife Arduino Conway's Game of Life with an Arduino UNO, MAX7219 and an 8x8 Dot Matrix Display. Video - https://youtu.be/qY5oLLSfSIA Cont

null 3 Oct 13, 2021
code (written in C) to check day by entering Date in DD/MM/YYYY format

Minimal Calendar Last Updated : Oct. 26, 2021 This code(written in C) can be used to know the day of the entered date in DD/MM/YYYY format. This c

Priyanshu Gupta 1 Oct 29, 2021
🚀 Kick-start your C++! A template for modern C++ projects using CMake, CI, code coverage, clang-format, reproducible dependency management and much more.

ModernCppStarter Setting up a new C++ project usually requires a significant amount of preparation and boilerplate code, even more so for modern C++ p

Lars Melchior 3.1k Jan 1, 2023
This Repository is created to help fellow coders learn open source contributions. This Repository is created for Hacktoberfest 2021

Hacktoberfest 2021 Follow the README below to get started! This Repository is created to help fellow coders learn open source contributions This Repos

Somesh Debnath 6 Oct 24, 2022
The OpenEXR project provides the specification and reference implementation of the EXR file format, the professional-grade image storage format of the motion picture industry.

OpenEXR OpenEXR provides the specification and reference implementation of the EXR file format, the professional-grade image storage format of the mot

Academy Software Foundation 1.3k Jan 6, 2023
(Simple String Format) is an syntax of format and a library for parse this.

SSFMT (Simple String Format) is an syntax of format and a library for parse this. SSFMT != {fmt} SSFMT is NOT an API/library for parse {fmt} syntax !

null 2 Jan 30, 2022
This tool will check a list of IP addresses of RouterOS-based routers to validate if they were infected with Meris.

Meris RouterOS Checker This tool will check a list of ip addresses of RouterOS-based routers to validate if they were infected with Meris. The tool wi

Eclypsium 84 Nov 23, 2022
Simple useful interoperability tests for WebRTC libraries. If you are a WebRTC library developer we'd love to include you!

Overview This project aims to be a convenient location for WebRTC library developers to perform interoperability tests. Who can Participate The projec

Aaron Clauson 106 Dec 18, 2022
Enabling the Windows Subsystem for Linux to include support for Wayland and X server related scenarios

Welcome to WSLg WSLg is short for Windows Subsystem for Linux GUI and the purpose of the project is to enable support for running Linux GUI applicatio

Microsoft 8.3k Jan 4, 2023
A collection of multiple types of lists used during pentesting, collected in one place. List types include usernames, passwords, combos, wordlist and may more..

Access list is a collection of multiple types of lists used during pentesting, collected in one place, created by Undercode This list include a collec

UNDERCODE UTILITIES 10 Nov 21, 2022
Protobuf for Proxyman app - Include Apple Silicon & Intel architecture

Protobuf for Proxyman macOS app Protobuf for Proxyman app - Include Apple Silicon & Intel architecture How to build Open the project on the latest Xco

Proxyman 6 Nov 29, 2021
designed for debug Espressif's ESP series chips, include ESP32/ESP32-S2/ESP32-C3/ESP32-S3...

ESPLink 中文 ESPLink Introduce Features Pin Description esplink-tool Product Link Reference ESPLink Introduce ESPLink is a debug tool build for Expressi

wuxx 34 Nov 19, 2022
CMake integration for include-what-you-use

Include-What-You-Use CMake Targets CMake macro to add per-source level checks on individual targets for include-what-you-use violations Status Travis

ポリ平方 POLYSQUARE 8 Apr 10, 2021
A small and easy to use neural net implementation for C++. Just download and #include!

NN++ A short, self-contained, and easy-to-use neural net implementation for C++. It includes the neural net implementation and a Matrix class for basi

Gil Dekel 227 Nov 11, 2022
Include binary files in C/C++

incbin Include binary and textual files in your C/C++ applications with ease Example #include "incbin.h" INCBIN(Icon, "icon.png"); // Re

Dale Weiler 759 Jan 4, 2023