CPP Build System and Library
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
- MODULE: [ *.cpp, *.hpp ] > [ *.cpp ] > Runtime: executable file
*.c, *.cpp | > | *.lib, *.dll / *.a, *.so | > | executable file |
*.h, *.hpp | > | *.h, *.hpp | > |
- compile: *.cpp > *.S
- assemble: *.S > *.o
- 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
- (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
- g++ -o program main.cpp
- Installation
- (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
- Installation
- (autotools) Makefile.am[automake], configure.ac[autoconf] > configure > Makefile
- Installation: M4 > autoconf > automake > lintool
- Usage: configure > make > make install
- ./configure --prefix=/home/user
- make
- make install
- make PREFIX=/home/user install
- (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
- Installation
- (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
- Installation
- (g++) *.cpp, *.h > g++ > Executable File
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
- build: CMAKE_BINARY_DIR
- project: CMAKE_SOURCE_DIR
- 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()
- g++ -o [*.so] [*.o], ar rcs [*.a] [*.o]: library files linker
# 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
- link_directories > target_link_directories, 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])
- CMakeLists.txt
[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])
- CMakeLists.txt
[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])
- CMakeLists.txt
[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])
- CMakeLists.txt
[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])
- src/CMakeLists.txt
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])
- CMakeLists.txt
[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])
- CMakeLists.txt
[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])
- CMakeLists.txt
[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])
- CMakeLists.txt
[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])
- CMakeLists.txt
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 > program: g++ -o [program]
$ g++ -o program main.cpp
Warnings: g++ -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
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/include/c++
- /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/include/c++
- /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)
- Object File(*.o)
- SHARED (dynamic link)
- Linux: library.so / Windows: library.dll
- Executable File
- Library Code(library.so)
- Object File(*.o)
- Program Code
- STATIC (static link)
- No Link
- MODULE
- Executable File
- Object File(*.o)
- Program Code
- Object File(*.o)
- Executable File
- MODULE
|-- 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
- https://blog.naver.com/lifeisforu
- https://gist.github.com/dongbum/d1d49e38a20f9cf52ea39f9ce2702160
- https://github.com/Ownfos/cmake-study
- https://github.com/jacking75/examples_CMake
- https://nx006.tistory.com/36
- https://yaaam.tistory.com/entry/Linux-%EB%8F%99%EC%A0%81-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EB%A1%9C%EB%93%9C-dlopen-dlsym-dlclose-dlerror
- https://doitnow-man.tistory.com/entry/Linux-dynamic-library-dlopen-dlsym-dlclose-dlerror-%EC%82%AC%EC%9A%A9%EB%B2%95
- https://wiki.kldp.org/wiki.php/DocbookSgml/C%2B%2B-dlopen