quantitative analysis/programming

CPP Build System and Library

ecstasy 2024. 7. 6. 15:42

Advanced C++ Syntax

Compile-Time vs Runtime

  • Compile Time Keywords
    • const, constexpr, static, inline, template
  • Runtime Keywords
    • new, delete, try, catch, throw, dynamic_cast, virtual, mutual

 

 

Conditional compile

#define A 1
#define B 1
#undef B
#if A == 0
#elif A == 1
#else		
#endif
#ifdef A		
#elifdef		//(since C++23)
#else		
#endif
#ifndef	A	
#elifndef		//(since C++23)
#else		
#endif

 

 

Header Guard

#ifndef MATH_H
#define MATH_H

~

#endif
#pragma once

 

 

 

type qualifier: const / volatile / & / && 

  • [const]: const type
  • [volatile]: volatile type
  • [&]: type &, const type &
  • [&&]: type &&, const type &&
// Function
[TYPE] [IDENTIFIER](PARAMETER) {};
const [TYPE] [IDENTIFIER](PARAMETER) {};
[TYPE] [IDENTIFIER](const PARAMETER) {};
[TYPE] [IDENTIFIER] (PARAMETER) const {};

// Function Pointer
[TYPE] (* [IDENTIFIER])(PARAMETER) {};
const [TYPE] (*[IDENTIFIER])(PARAMETER) {};
[TYPE] (* const [IDENTIFIER])(PARAMETER) {};
[TYPE] (*[IDENTIFIER])(const PARAMETER) {};
[TYPE] (*[IDENTIFIER])(PARAMETER) const {};
//

 

 

Constant Expression

constexpr TYPE IDENTIFIER;
constexpr TYPE IDENTIFIER{};
constexpr TYPE IDENTIFIER = VALUE;
constexpr TYPE IDENTIFIER{ VALUE };
inline constexpr TYPE IDENTIFIER = VALUE;


constinit TYPE IDENTIFIER;
constinit TYPE IDENTIFIER{};
constinit TYPE IDENTIFIER = VALUE;
constinit TYPE IDENTIFIER{ VALUE };
static constinit TYPE IDENTIFIER = VALUE;


constexpr TYPE IDENTIFIER(PARAMETER1-TYPE VALUE1, PARAMETER2-TYPE VALUE2, ...) {
...
}
consteval TYPE IDENTIFIER(PARAMETER1-TYPE VALUE1, PARAMETER2-TYPE VALUE2, ...) {
...
}

 

 

 

Storage Duration

static

static TYPE IDENTIFIER;
static TYPE IDENTIFIER = VALUE;
static inline TYPE IDENTIFIER = VALUE;
static constinit TYPE IDENTIFIER;
static constinit TYPE IDENTIFIER{};
static constinit TYPE IDENTIFIER = VALUE;
static constexpr TYPE IDENTIFIER = VALUE;
static inline constexpr TYPE IDENTIFIER = VALUE;

 

extern

extern

 

thread_local

thread_local

 

mutable

mutable

 

 

 

 

 

 


Overview

Compilation

  • Compiler types
    • Transcompiler
    • JIT compiler(Just-in-time compiler)
    • AOT compiler(Ahead-of-time compiler)
    • Decompiler[ Assembly Language: Machine Code ]
    • Hardware Compilers

 

Source Code > Preprocessor > Compiler > Assembly Code > Assembler > Object Code > Linker > Machine Code > Loader > Runtime: Memory

  • Preprocessor
    • [ *.c, *.cpp ] > [ *.h, *.hpp ] 
  • Compiler
    • [ *.c, *.cpp ] > [ *.o ]
  • Linker
    • [ *.o ] > [ *a, *.so, *lib, *dll ]
    • [ *.o ] + [ *a, *.so, *lib, *dll ] > [ *.out, *.exe ]
  • Loader
    • [ *.so, *.dll ] +  [ *.out, *.exe ] > loading everything in memory

 

 

Meta Build System: CMake | Build System: Make | Build: gcc/g++

File

  • Source File
    • *.c, *.cpp, *.h, *.hpp
  • Binary File
    • Static Library File: *.a, *.lib
    • Dynamic Library File: *.so, *.dll
    • Relocatable File: *.o
    • Executable File: *.out, *.exe

 

Directory

  • src: main.cpp + ~
  • bin: program[ *.out, *.exe ]
  • lib: module.o, libmodule.a, libmodule.so 

 

 

Build

  • Executable File
    • MODULE: [ *.cpp, *.hpp ] > [ *.cpp ] > Runtime: executable file  
      • main.cpp, module.h
    • STATIC: [ *.cpp, *.hpp ] > [ *.a, *.hpp ] > Runtime: executable file
      • main.cpp, module.cpp, module.h 
    • SHARED: [ *.cpp, *.hpp ] > [ *.so, *.hpp ] > Runtime: executable file + *.so
      • main.cpp, module.cpp, module.h
*.c, *.cpp > *.lib, *.dll / *.a, *.so > executable file
*.h, *.hpp > *.h, *.hpp >
  1. compile: *.cpp > *.S
  2. assemble: *.S > *.o
  3. linking: *.o > executable file

 

Build Tools

: GCC/G++[*.c/*.h, *.cpp/*.hpp] > Make[Makefile] > Autotools > CMake[CMakeLists.txt] > Ninja[*.ninja] > Catkin[package.xml]

  • CMake: CMakeLists.txt > Makefiles
  • Make: Makefiles > *.c/*.h, *.cpp/*.hpp > Executable File
  • GCC/G++: *.c/*.h, *.cpp/*.hpp > Executable File
// main.cpp
#include "module.hpp"

int main() {
    func();
    return 0;
}
// module.cpp
#include <iostream>
#include "module.hpp"

void func(){
    std::cout << "Hello, World!" << std::endl;
};
// module.hpp
void func();

 

  •  Command
    1. (g++) *.cpp, *.h > g++ > Executable File
      • Installation
        • apt install g++ 
      • Usage
        • g++ -o program main.cpp
          • g++ -o main.o -c main.cpp
          • g++ -o program main.o
    2. (make) Makefile > make > Executable File
      • Installation
        • apt install make
      • Usage
        • make
        • make [executable file]
        • make install
        • make PREFIX=/home/user install
        • make uninstall
        • make clean
      • Options
        • -d : debug mode
        • -e : enviroment variables override assignments within makefiles
        • -i : ignore error codes
        • -s : silent mode
        • -t : touch target files
    3. (autotools) Makefile.am[automake], configure.ac[autoconf] > configure > Makefile
    4. (cmake) CMakeLists.txt > cmake > Makefile
      • Installation
        • apt install cmake
      • Usage in a build folder
        • cmake ..
        • cmake -S..
        • cmake -S.. -B.
        • cmake -S.. -B. -DCMAKE_INSTALL_PREFIX=..
        • cmake --build ./
        • cmake --build ./ --target install
      • Options
        • -S, -H : Source File Path
        • -B : Build Directory Path
        • -DCMAKE_INSTALL_PREFIX : Installation Path
    5. (Catkin) .catkin_tools > package.xml, CMakeLists.txt
      • Installation
        • sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
        • curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
        • sudo apt update
        • apt install python3-catkin-tools
      • Usage
        • catkin init
        • catkin create pkg [PROJECT_NAME]
        • catkin config
        • catkin list
        • catkin build
        • catkin clean

 

 

 

 


Build: Catkin

catkin create pkg PROJECT_NAME --catkin-deps std_msgs roscpp rospy
catkin init # .catkin_tools

catkin config
catkin list

catkin build # source devel/setup.bash
catkin clean

 

 

Catkin Project Structure

 

 


Build: CMake

project
|-- build
    |-- src
    |-- lib
    |-- include
|-- bin
|-- src
|-- lib
|-- include
|-- modules
    |-- module1
        |-- src
        |-- lib
        |-- include
        |-- submodules
            |-- submodule1
                |-- src
                |-- lib
                |-- include
            |-- submodule2
                |-- src
                |-- lib
                |-- include
                ...
                ...
            |-- submoduleP
                |-- src
                |-- lib
                |-- include
    |-- moduleN
        |-- src
        |-- lib
        |-- include
        |-- submodules
            |-- submodule1
                |-- src
                |-- lib
                |-- include
            |-- submodule2
                |-- src
                |-- lib
                |-- include
                ...
                ...
            |-- submoduleQ
                |-- src
                |-- lib
                |-- include
  • Path Locations
    • project: CMAKE_SOURCE_DIR
      • build: CMAKE_BINARY_DIR
        • bin: ${CMAKE_BINARY_DIR}/bin
        • lib: ${CMAKE_BINARY_DIR}/lib
      • bin: ${CMAKE_SOURCE_DIR}/bin
      • src: ${CMAKE_SOURCE_DIR}/src
      • lib: CMAKE_LIBRARY_PATH, {CMAKE_SOURCE_DIR}/lib
      • include: CMAKE_INCLUDE_PATH, ${CMAKE_SOURCE_DIR}/include
  • Command
    • g++ -o [*.so] [*.o], ar rcs [*.a] [*.o]: library files linker
      • add_library()
    • g++ -o program [*.cpp] + [*.o, *.a, *.so]
    • g++ -I[]: header files path; *.h, *.hpp
      • include_directories()
      • target_include_directories()
    • g++ -L[]: library files path; *.a, *.so
      • link_directories()
      • target_link_directories()
    • g++ -l[]: library files; *.a, *.so
      • target_link_libraries()
      • link_directories()
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(PROJ_NAME VERSION 1.0)
find_package(OpenCV REQUIRED)

set(SOURCES main.cpp)
add_executable(${PROJECT_NAME} ${SOURCES})

target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
include_directories(${OpenCV_INCLUDE_DIRS})
build$ cmake .. && cmake --build .
$ cmake -H. -Bbuild && cmake --build ./build

 

CMake: CMakeLists.txt > Makefile > Executable file

https://cmake.org/cmake/help/latest/index.html

https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/Useful-Variables

 

  • Project
    • cmake_minimum_required
    • project
    • add_executable
    • add_library: Library 
    • target_link_libraries: Dependency
  • Subdirectories
    • add_subdirectory
    • include
    • include_guard
    • return
  • Variables
    • set/unset
    • option
    • block/unblock
    • set_property
    • mark_as_advanced
  • Flow Control
    • if / elseif / else / endif
    • foreach / endforeach
    • while / endwhile
    • break / continue
  • Functions And Macros
    • func / macr
    • function / endfunction
    • macro / endmacro
    • print_me / _printme / printme
    • dangerous
    • cmake_parse_arguments
    • demoArgs
    • libWithTest
    • inner / outer
    • doSomething
    • configure_file
    • cmake_language
    • someCommand
  • Property
    • define_property
    • set_property / get_property
    • set_source_files_properties / get_source_file_property
    • get_cmake_property
    • set_directory_properties / get_directory_property
    • set_target_properties / get_target_property
    • set_tests_properties / get_test_property
  • Generator Expressions
  • Modules
    • include
    • find_package
    • check_source_compiles
      • check_c_source_compiles
      • check_cxx_source_compiles
      • check_fortran_source_compiles
    • check_source_runs
      • check_c_source_runs
      • check_cxx_source_runs
      • check_fortran_source_runs
    • check_compiler_flag
      • check_c_compiler_flag
      • check_cxx_compiler_flag
      • check_fortran_compiler_flag
    • check_linker_flag
    • check_symbol_exists
      • check_cxx_symbol_exists
    • cmake_push_check_state
    • cmake_pop_check_state
    • cmake_reset_check_state
  • Policies
    • cmake_policy
  • Debugging And Diagnostics
    • message
    • doTimeConsumingDiagnostics
    • checkSomething / checkSomethingElse
    • cmake_print_properties
    • cmake_print_variables
    • variable_watch
    • target_include_directories
    • add_custom_target
    • file

cmake_minimum_required

cmake_minimum_required(VERSION major.minor[.patch[.tweak]])

project

project(projectName
  [VERSION major[.minor[.patch[.tweak]]]]
  [LANGUAGES languageName ...]
)

add_executable

set(SOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
file(GLOB SOURCES ${SOURCES_DIR}/*.cpp)
add_executable(executable_file ${SOURCES})

add_library

add_library(targetName [STATIC | SHARED | MODULE]
  [EXCLUDE_FROM_ALL]
  source1 [source2 ...]
)

target_link_libraries

target_link_libraries(targetName
  <PRIVATE|PUBLIC|INTERFACE> item1 [item2 ...]
  [<PRIVATE|PUBLIC|INTERFACE> item3 [item4 ...]]
  ...
)

 

set/unset

set(optVar initialValue CACHE BOOL helpString)

set_property

set_property(CACHE TRAFFIC_LIGHT PROPERTY STRINGS Red Orange Green)

mark_as_advanced

mark_as_advanced([CLEAR|FORCE] var1 [var2...])

block/endblock

block([SCOPE_FOR [VARIABLES] [POLICIES]] [PROPAGATE var...])

message

message("Locations")
message("${ORIGIN}")
message("${CMAKE_BINARY_DIR}") # .../project/build
message("${CMAKE_SOURCE_DIR}") # .../project
message("${CMAKE_COMMAND}") # /usr/local/bin/cmake
message("${CMAKE_CURRENT_BINARY_DIR}")
message("${CMAKE_CURRENT_SOURCE_DIR}")
message("${CMAKE_CURRENT_LIST_FILE}")
message("${CMAKE_CURRENT_LIST_DIR}")
message("${CMAKE_CURRENT_LIST_LINE}")
message("${CMAKE_FILES_DIRECTORY}")
message("${CMAKE_MODULE_PATH}")
message("${CMAKE_ROOT}")
message("${PROJECT_NAME}")
message("${CMAKE_PROJECT_NAME}")
message("${PROJECT_BINARY_DIR}")
message("${PROJECT_SOURCE_DIR}")

message("Package")
message("${package_INCLUDE_DIRS}")
message("${package_LIBRARY_DIRS}")
message("${package_LIBRARIES}")
message("${package_VERSION}")
message("${package_NO_SYSTEM_PATHS}")
message("${package_USE_STATIC_LIBS}")
message("${package_USE_MULTITHREADED}")
message("${package_USE_STATIC_RUNTIME}")


message("Environment Variables")
message("${CMAKE_INCLUDE_PATH}") # .../project/include
message("${CMAKE_LIBRARY_PATH}") # .../project/lib
message("${CMAKE_PREFIX_PATH}")
message("${CMAKE_INSTALL_ALWAYS}")
message("${$ENV{name}}")
message("${DESTDIR}")

message("System & Compiler Information")
message("${CMAKE_MAJOR_VERSION}")
message("${CMAKE_MINOR_VERSION}")
message("${CMAKE_PATCH_VERSION}")
message("${CMAKE_TWEAK_VERSION}")
message("${CMAKE_VERSION}")
message("${CMAKE_GENERATOR}")
message("${BORLAND}")
message("${WATCOM}")
message("${MSVC}")
message("${MSVC_IDE}")
message("${MSVC60}")
message("${MSVC70}")
message("${MSVC71}")
message("${MSVC80}")
message("${CMAKE_COMPILER_2005}")
message("${MSVC90}")
message("${MSVC10}")
message("${CMAKE_C_COMPILER_ID}")
message("${CMAKE_CXX_COMPILER_ID}")


message("Various Options")
message("${CMAKE_SKIP_RULE_DEPENDENCY}")
message("${CMAKE_SKIP_INSTALL_ALL_DEPENDENCY}")
message("${CMAKE_INCLUDE_CURRENT_DIR}")
message("${CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE}")
message("${CMAKE_VERBOSE_MAKEFILE}")
message("${CMAKE_SUPPRESS_REGENERATION}")
message("${CMAKE_COLOR_MAKEFILE}")
message("${CMAKE_SKIP_PREPROCESSED_SOURCE_RULES}")
message("${CMAKE_SKIP_ASSEMBLY_SOURCE_RULES}")

message("Compilers and Tools")
message("${BUILD_SHARED_LIBS}")
message("${CMAKE_BUILD_TYPE}")
message("${CMAKE_CONFIGURATION_TYPES}")
message("${CMAKE_SHARED_LINKER_FLAGS}")
message("${CMAKE_CFG_INTDIR}")
message("${CMAKE_C_FLAGS}") # None
message("${CMAKE_C_FLAGS_DEBUG}") # Debug
message("${CMAKE_C_FLAGS_RELEASE}") # Release
message("${CMAKE_C_FLAGS_RELWITHDEBINFO}") # RelWithDebInfo
message("${CMAKE_C_FLAGS_MINSIZEREL}") # MinSizeRel
message("${CMAKE_C_FLAGS_<CONFIG>}")
message("${CMAKE_C_COMPILER}")
message("${CMAKE_C_OUTPUT_EXTENSION}")
message("${CMAKE_CXX_FLAGS}") # None
message("${CMAKE_CXX_FLAGS_DEBUG}") # Debug
message("${CMAKE_CXX_FLAGS_RELEASE}") # Release
message("${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") # RelWithDebInfo
message("${CMAKE_CXX_FLAGS_MINSIZEREL}") # MinSizeRel
message("${CMAKE_CXX_FLAGS_<CONFIG>}")
message("${CMAKE_CXX_COMPILER}")

message("Prefixes, Suffixes (Postfixes), and Extensions")
message("${CMAKE_EXECUTABLE_SUFFIX}")
message("${CMAKE_FIND_LIBRARY_PREFIXES}")
message("${CMAKE_FIND_LIBRARY_SUFFIXES}")
message("${CMAKE_STATIC_LIBRARY_PREFIX}")
message("${CMAKE_STATIC_LIBRARY_SUFFIX}")
message("${CMAKE_SHARED_LIBRARY_PREFIX}")
message("${CMAKE_SHARED_LIBRARY_SUFFIX}")
message("${CMAKE_<CONFIG>_POSTFIX}")

string

string(REGEX MATCH regex outVar input...)
string(REGEX MATCHALL regex outVar input...)
string(REGEX REPLACE regex replaceWith outVar input...)

list

list(LENGTH listVar outVar)
list(GET listVar index [index...] outVar)
list(INSERT listVar index item [item...])
list(APPEND listVar item [item...])
list(PREPEND listVar item [item...]) # Requires CMake 3.15 or later
list(FIND myList value outVar)
list(REMOVE_ITEM myList value [value...])
list(REMOVE_AT myList index [index...])
list(REMOVE_DUPLICATES myList)

# Requires CMake 3.15 or later
list(POP_FRONT myList [outVar1 [outVar2...]])
list(POP_BACK myList [outVar1 [outVar2...]])
list(REVERSE myList)
list(SORT myList [COMPARE method] [CASE case] [ORDER order])

 

math

math(EXPR outVar mathExpr [OUTPUT_FORMAT format])

 

 

CMake: Command Line Signature

https://cmake.org/cmake/help/latest/manual/cmake.1.html

// main.cpp
#include "opencv2/opencv.hpp"

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    cout << "OpenCV version : " << CV_VERSION << endl;
    cout << "Major version : " << CV_MAJOR_VERSION << endl;
    cout << "Minor version : " << CV_MINOR_VERSION << endl;
    cout << "Subminor version : " << CV_SUBMINOR_VERSION << endl;
}
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(NAME)
find_package(OpenCV REQUIRED) # library package

add_executable(program main.cpp)
target_link_libraries(program ${OpenCV_LIBS}) # /usr/local/lib/*.so
include_directories(${OpenCV_INCLUDE_DIRS}) # /usr/local/include/opencv4/.../*.hpp
cmake --help-module-list
cmake -S. -Bbuild
cmake -H. -Bbuild
cmake --build ./build
cmake --build ./build --target install

 

 

CMake Project Structure

  • source: main.cpp
  • module: module.cpp / module.h
    • cpp: add_subdirectory
    • h: include_directories
    • h: target_include_directories
  • library: library.a | library.so:
    • add_library
    • target_link_libraries
  • executable: program
    • add_executable
  • caution[link_directories, target_link_directories]
    • link_directories > target_link_directories, find_package
      • target_link_directories > target_link_libraries, find_package

 

 

 

Module CMake: program

  • cmake_minimum_required
  • project
  • add_executable

 

[cmake] build-module structure1

.
|-- CMakeLists.txt
|-- main.cpp
|-- module.cpp
|-- module.h
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(NAME)
add_executable(program main.cpp module.cpp)
$ cmake -H. -Bbuild
$ cmake --build build
  • *.h, *.hpp: #include "*.h"
    • main.cpp: #include "module.h"
    • module.cpp: #include "module.h"
  • *.c, *.cpp
    • CMakeLists.txt
      • add_executable([program] [main.cpp] [module.cpp])

 

[cmake] build-module structure2

.
|-- CMakeLists.txt
|-- main.cpp
|-- module
    |-- module.cpp
    |-- module.h
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(NAME)
add_executable(program main.cpp module/module.cpp)
$ cmake -H. -Bbuild
$ cmake --build build
  • *.h, *.hpp: #include "*.h"
    • main.cpp: #include "module/module.h"
    • module.cpp: #include "module.h"
  • *.c, *.cpp
    • CMakeLists.txt
      • add_executable([program] [main.cpp] [module]/[module.cpp])

 

[cmake] build-module structure3

.
|-- CMakeLists.txt
|-- main.cpp
|-- module.cpp
    |-- include
    |-- module.h
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(NAME)
add_executable(program main.cpp module.cpp)
$ cmake -H. -Bbuild
$ cmake --build build
  • *.h, *.hpp: #include "*.h"
    • main.cpp: #include "include/module.h"
    • module.cpp: #include "include/module.h"
  • *.c, *.cpp
    • CMakeLists.txt
      • add_executable([program] [main.cpp] [module.cpp])

 

[cmake] build-module structure4

.
|-- CMakeLists.txt
|-- main.cpp
|-- module
    |-- module.cpp
|-- include
    |-- module.h
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(NAME)
add_executable(program main.cpp module.cpp)
$ cmake -H. -Bbuild
$ cmake --build build
  • *.h, *.hpp: #include "*.h"
    • main.cpp: #include "include/module.h"
    • module.cpp: #include "../include/module.h"
  • *.c, *.cpp
    • CMakeLists.txt
      • add_executable([program] [main.cpp] [module]/[module.cpp])

 

[cmake] build-module structure5

.
|-- CMakeLists.txt
|-- src
    |-- CMakeLists.txt
    |-- main.cpp
    |-- module.cpp
    |-- module.h
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(mypro)
add_subdirectory(src)
add_executable(program src/main.cpp src/module.cpp)
# src/CMakeLists.txt
$ cmake -H. -Bbuild
$ cmake --build build
  • *.h, *.hpp: #include "*.h"
    • main.cpp: #include "module.h"
    • module.cpp: #include "module.h"
  • *.c, *.cpp
    • src/CMakeLists.txt
      • add_executable([program] [main.cpp] [module.cpp])

 

 

Package CMake: program

Header file[*.h, *.hpp]

find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})

 

Library[*.a, *.so]

find_package(Boost REQUIRED COMPONENTS system filesystem)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(program ${Boost_LIBRARIES})

 

 

 

 

Library CMake: pragram + module.[a|so]

  • [1] Global Configuration
    • cmake_minimum_required
    • project
    • add_subdirectory
    • include_directories
  • [2] Local Configuration
    • add_executable
    • add_library
    • target_link_libraries
    • target_include_directories

 

[cmake] build-library structure1

.
|-- CMakeLists.txt
|-- main.cpp
|-- module.cpp
|-- module.h
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(NAME)

add_executable(program main.cpp module.cpp)
target_include_directories(program PRIVATE ./) # include_directories(./) # from module.hpp
target_link_libraries(program library) # from library.[a|so]

add_library(library STATIC|SHARED module.cpp) # to library.[a|so]
target_include_directories(library PRIVATE ./) # include_directories(./) # from module.hpp
$ cmake -H. -Bbuild
$ cmake --build build
  • *.h, *.hpp: #include "*.h"
    • main.cpp: #include "module.h"
    • module.cpp: #include "module.h"
  • *.c, *.cpp
    • CMakeLists.txt
      • add_library([library] STATIC|SHARED [module.cpp])
      • add_executable([program] [main.cpp] [module.cpp])
      • target_link_libraries([program] [library])

 

[cmake] build-library structure2

.
|-- CMakeLists.txt
|-- main.cpp
|-- module
    |-- CMakeLists.txt
    |-- module.cpp
    |-- module.h
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(NAME)
add_subdirectory(module) # module/module.cpp
include_directories(module) # module/module.hpp

add_executable(program main.cpp module/module.cpp)
target_link_libraries(program library) # from library.[a|so]
target_include_directories(program PRIVATE module) # from module.hpp
# module/CMakeLists.txt
add_library(library STATIC|SHARED module.cpp) # to library.[a|so]
target_include_directories(library PRIVATE ./) # from module.hpp
$ cmake -H. -Bbuild
$ cmake --build build
  • *.h, *.hpp: #include "*.h"
    • main.cpp: #include "module/module.h"
    • module.cpp: #include "module.h"
  • *.c, *.cpp
    • CMakeLists.txt
      • add_subdirectory([module])
      • add_executable([program] [main.cpp] [module]/[module.cpp])
      • target_link_libraries([program] [library])
    • module/CMakeLists.txt
      • add_library([library] STATIC|SHARED [module.cpp])

 

[cmake] build-library structure3

  • cmake_minimum_required
  • project
  • include_directories
  • add_library
  • add_executable
  • target_link_libraries
  • target_link_include_directories
.
|-- CMakeLists.txt
|-- main.cpp
|-- module.cpp
|-- include
    |-- module.h
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(NAME)
include_directories(include)

add_executable(program main.cpp module.cpp)
target_include_directories(program PUBLIC include)
target_link_libraries(program library)

add_library(library STATIC|SHARED module.cpp) # library.[a|so]
target_include_directories(library PUBLIC include)
$ cmake -H. -Bbuild
$ cmake --build build
  • *.h, *.hpp: #include "*.h"
    • main.cpp: #include "include/module.h"
    • module.cpp: #include "include/module.h"
  • *.c, *.cpp
    • CMakeLists.txt
      • include_directories([include])
      • add_library([library])
      • add_executable([program] [main.cpp] [module.cpp])
      • target_link_libraries([program] [library])
      • target_include_directories([library] PUBLIC [include])

 

 

[cmake] build-library structure4

  • cmake_minimum_required
  • project
  • include_directories
  • add_subdirectory
  • add_library
  • add_executable
  • target_link_libraries
  • target_link_include_directories
.
|-- CMakeLists.txt
|-- main.cpp
|-- module
    |-- CMakeLists.txt
    |-- module.cpp
|-- include
    |-- module.h
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(NAME)
add_subdirectory(module)
include_directories(include)

add_executable(program main.cpp module/module.cpp)
target_include_directories(program PUBLIC ./include)
target_link_libraries(program library)
# module/CMakeLists.txt
add_library(library STATIC|SHARED module.cpp) # module.[a|so]
target_include_directories(library PUBLIC ../include)
$ cmake -H. -Bbuild
$ cmake --build build
  • *.h, *.hpp: #include "*.h"
    • main.cpp: #include "inlcude/module.h"
    • module.cpp: #include "../inlcude/module.h"
  • *.c, *.cpp
    • CMakeLists.txt
      • include_directories([include])
      • add_subdirectory([module])
      • add_executable([program] [main.cpp] [module]/[module.cpp])
      • target_link_libraries([program] [library])
    • module/CMakeLists.txt
      • add_library([library] STATIC|SHARED [module.cpp])
      • target_include_directories([library] PUBLIC ../[include])

 

[cmake] build-library structure5

  • cmake_minimum_required
  • project
  • add_subdirectory
  • add_library
  • add_executable
  • target_link_libraries
.
|-- CMakeLists.txt
|-- src
    |-- CMakeLists.txt
    |-- main.cpp
    |-- module.cpp
    |-- module.h
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(NAME)
add_subdirectory(src)

add_executable(program src/main.cpp src/module.cpp)
target_link_libraries(program library)
# src/CMakeLists.txt
add_library(library STATIC|SHARED module.cpp) # library.[a|so]
$ cmake -H. -Bbuild
$ cmake --build build
  • *.h, *.hpp: #include "*.h"
    • main.cpp: #include "module.h"
    • module.cpp: #include "module.h"
  • *.c, *.cpp
    • CMakeLists.txt
      • add_subdirectory(src)
      • add_executable([program] src/[main.cpp] src/[module.cpp])
      • target_link_libraries([program] [library])
    • src/CMakeLists.txt
      • add_library([library] STATIC|SHARED [module.cpp])

 

 

 


Build: Autotools

 

 

 


Build: Make

make
make install
make install PREFIX=/usr/local/[INSTALLATION_PATH]

 

 

 

 


Build: GCC/G++/AR

: g++ -o program [*.cpp] + [*.o, *.a, *.so]

 

 

Environment Variables: LIBRARY_PATH

$ export LIBRARY_PATH=$LIBRARY_PATH # path linking libraries for *.a, *.so

 

 

Linking: module.o, libmodule.a, libmodule.so > program: g++ -p [program] [main.cpp] -L[] -l[] 

$ export LIBRARY_PATH=./lib:$LIBRARY_PATH
$ g++ -o program main.o module.o # <<< [module.o][module] liking: no link
$ g++ -o program main.cpp -lmodule # <<< [libmodule.a][static] liking
$ g++ -o program main.cpp -lmodule # <<< [libmodule.so][dynamic] linking
$ g++ -o program main.o module.o # <<< [module.o][module] liking: no link
$ g++ -o program main.cpp -Llib -lmodule # <<< [libmodule.a][static] liking
$ g++ -o program main.cpp -Llib -lmodule # <<< [libmodule.so][dynamic] linking

 

Compile + Linking: main.cpp, module.cpp > programg++ -o [program]

$ g++ -o program main.cpp

 

Warningsg++ -W[all]

g++ main.cpp
g++ -Wall main.cpp
g++ -Wextra main.cpp

 

[Source File] Header: include/*.h, include/*.hpp: g++ -I[include]

g++ -o program main.cpp -Iinclude

 

[Binary File] Library: lib/libmodule.a, lib/libmodule.so: g++ L[lib] -l[module]

g++ -o program main.cpp -Llib -lmodule

 

 

GCC/G++/AR: Library

  • Library
    • MODULE
      • [1] g++ -o main.o -c main.cpp
      • [2] g++ -o program main.o
    • STATIC
      • [1] g++ -o module.o -c module.cpp
      • [2] ar rcs libmodule.a module.o
      • [3] g++ -o program main.cpp -L. -lmodule -I.
    • SHARED
      • [1] g++ -fPIC -o module.o -c module.cpp 
      • [2] g++ -shared -o libmodule.so module.o
      • [3] g++ -o program main.cpp -L. -lmodule -I.
      • [4] export LD_LIBRARY_PATH=~:$LD_LIBRARY_PATH
      • [5] sudo ldconfig

 

 

Module Library

: module.o, main.o > program

  • g++ -o program main.cpp
    • [1] g++ -o main.o -c main.cpp
    • [2] g++ -o program main.o

 

[gcc/g++] build-module structure1

.
|-- main.cpp
|-- module.hpp

.
|-- main.cpp
|-- module.hpp
|-- main.o
|-- program
$ g++ -o main.o -c main.cpp # <<< compiler
$ g++ -o program main.o # <<< linker
$ ./program # <<< loader
$ g++ -o program main.cpp # <<< compiler + linker
$ ./program # <<< loader

 

 

[gcc/g++] build-module structure2

.
|-- main.cpp
|-- module.cpp
|-- module.hpp

.
|-- main.cpp
|-- module.cpp
|-- module.hpp
|-- main.o
|-- module.o
|-- program
$ g++ -o module.o -c module.cpp # <<< compiler(1)
$ g++ -o main.o -c main.cpp # <<< compiler(2)
$ g++ -o program main.o module.o # <<< linker
$ ./program # <<< loader
$ g++ -o program main.cpp module.cpp # <<< compiler + linker
$ ./program # <<< loader

 

 

Static Library

: module.o > libmodule.a > program

  • [1] g++ -o module.o -c module.cpp
  • [2] ar rcs libmodule.a module.o
  • [3] g++ -o program main.cpp -L. -lmodule -I.
    • -L: library file[ *.a ] 
    • -I: header file[ *.h, *.hpp ]

 

[gcc/g++/ar] build-library structure1

.
|-- main.cpp
|-- module.cpp
|-- module.hpp

.
|-- main.cpp
|-- module.cpp
|-- module.hpp
|-- module.o
|-- libmodule.a
|-- program
$ g++ -o module.o -c module.cpp # <<< compiler
$ ar rcs libmodule.a module.o # <<< linker
$ g++ -o program main.cpp -L. -lmodule -I. # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++/ar] build-library structure2: lib

.
|-- lib
|-- main.cpp
|-- module.cpp
|-- module.hpp

.
|-- lib
    |-- libmodule.a
    |-- module.o
|-- main.cpp
|-- module.cpp
|-- module.hpp
|-- program
$ g++ -o lib/module.o -c module.cpp # <<< compiler
$ ar rcs lib/libmodule.a lib/module.o # <<< linker
$ g++ -o program main.cpp -Llib -lmodule -I. # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++/ar] build-library structure3: bin

.
|-- bin
|-- main.cpp
|-- module.cpp
|-- module.hpp

.
|-- bin
    |-- program
|-- main.cpp
|-- module.cpp
|-- module.hpp
|-- libmodule.a
|-- module.o
$ g++ -o module.o -c module.cpp # compiler
$ ar rcs libmodule.a module.o # linker
$ g++ -o bin/program main.cpp -L. -lmodule -I. # linker
$ ./bin/program # <<< loader

 

 

[gcc/g++/ar] build-library structure4: bin, lib

.
|-- bin
|-- lib
|-- main.cpp
|-- module.cpp
|-- module.hpp

.
|-- bin
    |-- program
|-- lib
    |-- libmodule.a
    |-- module.o
|-- main.cpp
|-- module.cpp
|-- module.hpp
$ g++ -o lib/module.o -c module.cpp # <<< compiler
$ ar rcs lib/libmodule.a lib/module.o # <<< linker
$ g++ -o bin/program main.cpp -Llib -lmodule -I. # <<< linker
$ ./bin/program # <<< loader

 

 

[gcc/g++/ar] build-library structure5: bin, lib, src

.
|-- bin
|-- lib
|-- src
    |-- main.cpp
    |-- module.cpp
    |-- module.hpp

.
|-- bin
    |-- program
|-- lib
    |-- libmodule.a
    |-- module.o
|-- src
    |-- main.cpp
    |-- module.cpp
    |-- module.hpp
$ g++ -o lib/module.o -c src/module.cpp # <<< compiler
$ ar rcs lib/libmodule.a lib/module.o # <<< linker
$ g++ -o bin/program src/main.cpp -Llib -lmodule -Isrc # <<< linker
$ ./bin/program # <<< loader

 

 

[gcc/g++/ar] build-library structure6: module

.
|-- module
    |-- module.cpp
    |-- module.hpp
|-- main.cpp

.
|-- module
    |-- module.cpp
    |-- module.hpp
|-- main.cpp
|-- module.o
|-- libmodule.a
|-- program
$ g++ -o module.o -c module/module.cpp # <<< compiler
$ ar rcs libmodule.a module.o # <<< linker
$ g++ -o program main.cpp -L. -lmodule -Imodule # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++/ar] build-library structure7: include

.
|-- include
    |-- module.hpp
|-- main.cpp
|-- module.cpp

.
|-- include
    |-- module.hpp
|-- main.cpp
|-- module.cpp
|-- module.o
|-- libmodule.a
|-- program
$ g++ -o module.o -c module.cpp -Iinclude # <<< compiler
$ ar rcs libmodule.a module.o # <<< linker
$ g++ -o program main.cpp -L. -lmodule -Iinclude # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++/ar] build-library structure8: src/include

.
|-- src
    |-- main.cpp
    |-- module.cpp
|-- include
    |-- module.hpp

.
|-- src
    |-- main.cpp
    |-- module.cpp
|-- include
    |-- module.hpp
|-- module.o
|-- libmodule.a
|-- program
$ g++ -o module.o -c src/module.cpp -Iinclude # <<< compiler
$ ar rcs libmodule.a module.o # <<< linker
$ g++ -o program src/main.cpp -L. -lmodule -Iinclude # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++/ar] build-library structure9: src/module

.
|-- src
    |-- main.cpp
|-- module
    |-- module.cpp
    |-- module.hpp

.
|-- src
    |-- main.cpp
|-- module
    |-- module.cpp
    |-- module.hpp
|-- module.o
|-- libmodule.a
|-- program
$ g++ -o module.o -c module/module.cpp # <<< compiler
$ ar rcs libmodule.a module.o # <<< linker
$ g++ -o program src/main.cpp -L. -lmodule -Imodule # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++/ar] build-library structure10: module/include

.
|-- main.cpp
|-- module
    |-- module.cpp
|-- include
    |-- module.hpp

.
|-- main.cpp
|-- module
    |-- module.cpp
|-- include
    |-- module.hpp
|-- module.o
|-- libmodule.a
|-- program
$ g++ -o module.o -c module/module.cpp -Iinclude # <<< compiler
$ ar rcs libmodule.a module.o # <<< linker
$ g++ -o program main.cpp -L. -lmodule -Iinclude # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++/ar] build-library structure11: src/module/include

.
|-- src
    |-- main.cpp
|-- module
    |-- module.cpp
|-- include
    |-- module.hpp

.
|-- src
    |-- main.cpp
|-- module
    |-- module.cpp
|-- include
    |-- module.hpp
|-- module.o
|-- libmodule.a
|-- program
$ g++ -o module.o -c module/module.cpp -Iinclude # <<< compile
$ ar rcs libmodule.a module.o # <<< linker
$ g++ -o program src/main.cpp -L. -lmodule -Iinclude # <<< linker
$ ./program # <<< loader

 

 

 

Shared Library

: libmodule.so > program

  • Method1
    • [1] g++ -shared -o libmodule.so module.cpp
    • [2] g++ -o program main.cpp -L. -lmodule -I.
      • -L: library path
      • -l: library file[ lib*.so ] 
      • -I: header file[ *.h, *.hpp ]
    • [3] export LD_LIBRARY_PATH=~:$LD_LIBRARY_PATH
    • [4] sudo ldconfig
  • Method2
    • [1] g++ -fPIC -o module.o -c module.cpp 
    • [2] g++ -shared -o libmodule.so module.o
    • [3] g++ -o program main.cpp -L. -lmodule -I.
      • -L: library path
      • -l: library file[ lib*.so ]
      • -I: header file[ *.h, *.hpp ]
    • [4] export LD_LIBRARY_PATH=~:$LD_LIBRARY_PATH
    • [5] sudo ldconfig

 

[gcc/g++] build-library structure1

.
|-- main.cpp
|-- module.cpp
|-- module.hpp

.
|-- main.cpp
|-- module.cpp
|-- module.hpp
|-- libmodule.so
|-- program
$ g++ -fPIC -o module.o -c module.cpp # <<< compiler
$ g++ -shared -o libmodule.so module.o # lib[module].so <<< complier
$ g++ -o program main.cpp -L. -lmodule # -l[module] <<< linker
$ ./program # <<< loader

 

 

[gcc/g++] build-library structure2: lib

.
|-- lib
|-- main.cpp
|-- module.cpp
|-- module.hpp

.
|-- lib
    |-- libmodule.so
|-- main.cpp
|-- module.cpp
|-- module.hpp
|-- program
$ g++ -fPIC -o lib/module.o -c module.cpp # <<< compiler
$ g++ -shared -o lib/libmodule.so lib/module.o # [lib]/libmodule.so <<< compile
$ g++ -o program main.cpp -Llib -lmodule # -L[lib] <<< linker
$ ./program # <<< loader

 

 

[gcc/g++] build-library structure3: bin

.
|-- bin
|-- main.cpp
|-- module.cpp
|-- module.hpp

.
|-- bin
    |-- program
|-- main.cpp
|-- module.cpp
|-- module.hpp
|-- libmodule.so
$ g++ -fPIC -o module.o -c module.cpp # <<< compiler
$ g++ -shared -o libmodule.so module.o # lib[module].so <<< compile
$ g++ -o bin/program main.cpp -L. -lmodule # [bin]/program, -l[module] <<< linker
$ export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH # <<< loader
$ ./bin/program # <<< loader

 


[gcc/g++] build-library structure4: bin, lib

.
|-- bin
|-- lib
|-- main.cpp
|-- module.cpp
|-- module.hpp

.
|-- bin
    |-- program
|-- lib
    |-- libmodule.so
|-- main.cpp
|-- module.cpp
|-- module.hpp
$ g++ -fPIC -o lib/module.o -c module.cpp # <<< compiler
$ g++ -shared -o lib/libmodule.so lib/module.o # [lib]/lib[module].so <<< compile
$ g++ -o bin/program main.cpp -Llib -lmodule # [bin]/program, -L[lib], -l[module] <<< linker
$ export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH # <<< loader
$ ./bin/program # <<< loader

 

 

[gcc/g++] build-library structure5: bin, lin, src

.
|-- bin
|-- lib
|-- src
    |-- main.cpp
    |-- module.cpp
    |-- module.hpp

.
|-- bin
    |-- program
|-- lib
    |-- libmodule.so
|-- src
    |-- main.cpp
    |-- module.cpp
    |-- module.hpp
$ g++ -fPIC -o lib/module.o -c src/module.cpp # <<< compiler
$ g++ -shared -o lib/libmodule.so lib/module.o # [lib]/lib[module].so, [lib]/[module].cpp <<< compile
$ g++ -o bin/program src/main.cpp -Llib -lmodule # [bin]/program [src]/main.cpp, -L[lib], -l[module] <<< linker
$ export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH # <<< loader
$ ./bin/program # <<< loader

 

 

[gcc/g++] build-library structure6: module

.
|-- module
    |-- module.cpp
    |-- module.hpp
|-- main.cpp

.
|-- module
    |-- module.cpp
    |-- module.hpp
|-- main.cpp
|-- libmodule.so
|-- program
$ g++ -fPIC -o module.o -c module/module.cpp # <<< compiler
$ g++ -shared -o libmodule.so module.o # <<< linker
$ g++ -o program main.cpp -L. -lmodule -Imodule # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++] build-library structure7: include

.
|-- include
    |-- module.hpp
|-- main.cpp
|-- module.cpp

.
|-- include
    |-- module.hpp
|-- main.cpp
|-- module.cpp
|-- libmodule.so
|-- program
$ g++ -fPIC -o module.o -c module.cpp -Iinclude # <<< compiler
$ g++ -shared -o libmodule.so module.o # <<< linker
$ g++ -o program main.cpp -L. -lmodule -Iinclude # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++] build-library structure8: src/include

.
|-- src
    |-- main.cpp
    |-- module.cpp
|-- include
    |-- module.hpp

.
|-- src
    |-- main.cpp
    |-- module.cpp
|-- include
    |-- module.hpp
|-- libmodule.so
|-- program
$ g++ -fPIC -o module.o -c src/module.cpp -Iinclude # <<< compiler
$ g++ -shared -o libmodule.so module.o # <<< linker
$ g++ -o program src/main.cpp -L. -lmodule -Iinclude # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++] build-library structure9: src/module

.
|-- src
    |-- main.cpp
|-- module
    |-- module.cpp
    |-- module.hpp

.
|-- src
    |-- main.cpp
|-- module
    |-- module.cpp
    |-- module.hpp
|-- libmodule.so
|-- program
$ g++ -fPIC -o module.o -c module/module.cpp # <<< compiler
$ g++ -shared -o libmodule.so module.o # <<< linker
$ g++ -o program src/main.cpp -L. -lmodule -Imodule # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++] build-library structure10: module/include

.
|-- main.cpp
|-- module
    |-- module.cpp
|-- include
    |-- module.hpp

.
|-- main.cpp
|-- module
    |-- module.cpp
|-- include
    |-- module.hpp
|-- libmodule.so
|-- program
$ g++ -fPIC -o module.o -c module/module.cpp -Iinclude # <<< compiler
$ g++ -shared -o libmodule.so module.o # <<< linker
$ g++ -o program main.cpp -L. -lmodule -Iinclude # <<< linker
$ ./program # <<< loader

 

 

[gcc/g++] build-library structure11: src/module/include

.
|-- src
    |-- main.cpp
|-- module
    |-- module.cpp
|-- include
    |-- module.hpp

.
|-- src
    |-- main.cpp
|-- module
    |-- module.cpp
|-- include
    |-- module.hpp
|-- libmodule.so
|-- program
$ g++ -fPIC -o module.o -c module/module.cpp -Iinclude # <<< compiler
$ g++ -shared -o libmodule.so module.o # <<< linker
$ g++ -o program src/main.cpp -L. -lmodule -Iinclude # <<< linker
$ ./program # <<< loader

 

 

PKGCONIFG

  • /usr/lib/pkgconfig, /usr/local/lib/pkgconfig
# /usr/lib
$ sudo mkdir /usr/lib/pkgconfig
$ sudo cp .../package/build/unix-install/package.pc /usr/lib/pkgconfig/

$ echo "export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig" >> ~/.bashrc
$ source ~/.bashrc
# /usr/local/lib
$ sudo mkdir /usr/local/lib/pkgconfig
$ sudo cp .../package/build/unix-install/package.pc /usr/local/lib/pkgconfig/

$ echo "export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig" >> ~/.bashrc
$ source ~/.bashrc
$ g++ main.cpp `pkg-config --libs --cflags [package]` -o program

 

 

 


Library

Unix-Like File System

Unix System Resources: /usr

  • System Environment
    • /usr/bin: User Commander
    • /usr/sbin: Administrator Commander
    • /usr/lib: Official Library
      • /usr/lib/pkgconfig
    • /usr/include: C or C++ Header Files
      • /usr/include/c++
        • iostream, vector, string, ...
    • /usr/share: Architecture-Independent Data
  • User Defined
    • /usr/local/bin: User Commander
    • /usr/local/sbin: Administrator Commander
    • /usr/local/lib: User Defined Library
      • /usr/local/lib/pkgconfig
    • /usr/local/include: User Defined C or C++ Header Files
      • /usr/local/include/c++
        • iostream, vector, string, ...
    • /usr/local/share: Architecture-Independent Data

 

 

Library Linker Type

Linker: STATIC | SHARED | MODULE

Linker Extension Compile-Time Independent Execution Runtime
MODULE *.h, *.hpp Heavy Yes Heavy
STATIC *.a, *.lib Light Yes Heavy
SHARED(Dynamic) *.so, *.dll Light No Light
  • Link
    • STATIC (static link)
      • Linux: library.a / Windows: library.lib
      • Executable File
        • Object File(*.o)
          • Program Code
          • Library Code(library.a)
    • SHARED (dynamic link)
      • Linux: library.so / Windows: library.dll
      • Executable File
        • Library Code(library.so)
        • Object File(*.o)
          • Program Code
  • No Link
    • MODULE
      • Executable File
        • Object File(*.o)
          • Program Code
|-- main.cpp
|-- module.cpp
|-- module.h
|-- CMakeLists.txt
|-- build
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(Name LANGUAGES CXX)
add_executable(main main.cpp module.cpp)
# CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(Name LANGUAGES CXX)
add_library(library STATIC module.cpp module.h) # library.a
add_executable(main main.cpp module.cpp)
target_link_libraries(main PRIVATE library)

 

 

 

Static Library

#

 

 

 

 

Dynamic Library

# Loader: [ ./bin/program, ./lib/libmodule.so ]
$ export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
$ ldconfig -v
  • Windows
    • set PATH=%PATH% 
  • Linux
    • export LD_LIBRARY_PATH=$LD_LIBRARY_PATH
  • MacOS
    • export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH
# CMakeLists.txt
add_executable(program main.cpp)
target_link_libraries(program PRIVATE library)

set_target_properties(program PROPERTIES
    INSTALL_RPATH_USE_LINK_PATH TRUE
    INSTALL_RPATH "$ORIGIN/../lib"
)

 

 

 

 

 

 

 

 

 


Reference