...
# Вместо этой строчки также можно указать путь из командой строки:
# $ cmake -DOPENSSL_ROOT_DIR=/usr/local/ssl -DOPENSSL_LIBRARIES=/usr/local/ssl/lib ..
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/openssl)
# Используем FindOpenSSL.cmake для поиска
find_package(OpenSSL REQUIRED)
...
target_link_directories(my_target ${CMAKE_CURRENT_SOURCE_DIR}/openssl/lib)
target_link_libraries(my_target PRIVATE crypto ssl)
int my_function() {
return 42;
}
int main(void) {
int a = my_function();
printf("%d\n", a);
return 0;
}
(gdb) disassemble my_function
Dump of assembler code for function my_function:
0x08048388 <+0>: push %ebp
0x08048389 <+1>: mov %esp,%ebp
0x0804838b <+3>: mov $0x2a,%eax
0x08048390 <+8>: pop %ebp
0x08048391 <+9>: ret
b *0x08048391
commands
return (int)43
continue
end
(gdb) run
Starting program: /root/a.out
Breakpoint 1, 0x08048391 in foo ()
43 <=== новое значение
[Inferior 1 (process 127) exited normally]
git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
cd grpc
git submodule update --init
make
sudo make install # <<< установка grpc
cd third_party/protobuf
make && sudo make install
pkg-config --libs grpc
-L/usr/local/lib -lgrpc
pkg-config --libs protobuf
-L/usr/local/lib -lprotobuf -pthread -lpthread
include_directories("C:\\Program Files\\...\\include") #в этой папке tlhelp32.h
packages_test
├── .git
├── cmake // Папка с доп. CMake скриптами если в этом есть необходимость
├── build // Результат сборки
│ └─ res.exe // Исполняемый файл
├── CMakeLists.txt // Конфигурация сборки проекта
├── src
│ ├─ main.cpp // Точка входа, main()
│ └─ ...// Прочие файлы проекта
├── dependencies // Зависимости (подключаются через механизм submodule)
│ ├─ vendor_package_0 // У каждой зависимости своя внутренняя организация
│ └─ vendor_package_1
└── test // Тесты
├── CMakeLists.txt
└── src
└── test_main.cpp
cmake_minimum_required(VERSION 3.0)
project(playrix_project VERSION 1.0 LANGUAGES CXX)
add_executable(playrix src/main.cpp)
# Импортируем наши зависимости. Это не приводит к сборке, но просто позволяет нам использовать target'ы этих проектов.
add_subdirectory(dependencies/vendor_package_0)
add_subdirectory(dependencies/vendor_package_1)
# Забудьте про include_directories и link_directories! В современном CMake следует использовать targets и properties.
# Опредеяем зависимости нашего проекта
target_link_libraries(playrix # Имя нашего executable'а
PRIVATE # Определяет область видимости зависимостей для внешних проектов
vendor_package_0_target # Настоящее имя target'а надо смотреть в vendor_package_0 CMakeLists.txt (add_library)
vendor_package_1_target
)
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
project(mylib_combined VERSION 0.1 LANGUAGES CXX)
# Нам нужны статические либы
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost COMPONENTS system filesystem REQUIRED)
# Наша собственная либа.
# К сожалению мы не может использовать add_library OBJECT либу, т.к.
# CMake не умеет работать с IMPORTED OBJECT либами, т.е. он не умеет
# экстрактить (ar -x) существующею static либу, чтобы собрать её потом
# в одну большую (ar -qcs).
add_library(mylib mylib.cpp)
add_custom_command(
TARGET mylib
POST_BUILD
# Экстрактим нашу свежесобранную либу. Не самое красивое решение, но
# что поделать ¯\_(ツ)_/¯
COMMAND ar -x $<TARGET_FILE:mylib>
# Теперь наши буст либы
COMMAND ar -x ${Boost_SYSTEM_LIBRARY}
COMMAND ar -x ${Boost_FILESYSTEM_LIBRARY}
# А теперь собираем всё обратно
COMMAND ar -qcs lib${PROJECT_NAME}.a *.o
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
project(mylib_combined VERSION 0.1 LANGUAGES CXX)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost COMPONENTS system filesystem REQUIRED)
add_library(mylib mylib.cpp)
add_custom_target(mylib_packer
COMMAND ar -x $<TARGET_FILE:mylib>
COMMAND ar -x ${Boost_SYSTEM_LIBRARY}
COMMAND ar -x ${Boost_FILESYSTEM_LIBRARY}
COMMAND ar -qcs lib${PROJECT_NAME}.a *.o
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS mylib
)
add_library(mylib_combined STATIC IMPORTED GLOBAL)
add_dependencies(mylib_combined mylib_packer)
set_target_properties(mylib_combined
PROPERTIES
IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib${PROJECT_NAME}.a
)
#include <boost/beast.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
namespace http = boost::beast::http;
int main() {
const std::string host = "scooterlabs.com";
const std::string target = "/echo?input=test";
// I/O контекст, необходимый для всех I/O операций
boost::asio::io_context ioc;
// Resolver для определения endpoint'ов
boost::asio::ip::tcp::resolver resolver(ioc);
// Tcp сокет, использующейся для соединения
boost::asio::ip::tcp::socket socket(ioc);
// Резолвим адрес и устанавливаем соединение
boost::asio::connect(socket, resolver.resolve(host, "80"));
// Дальше необходимо создать HTTP GET реквест с указанием таргета
http::request<http::string_body> req(http::verb::get, target, 11);
// Задаём поля HTTP заголовка
req.set(http::field::host, host);
req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
// Отправляем реквест через приконекченный сокет
http::write(socket, req);
// Часть, отвечающая за чтение респонса
{
boost::beast::flat_buffer buffer;
http::response<http::dynamic_body> res;
http::read(socket, buffer, res);
std::cout << res << std::endl;
}
// Закрываем соединение
socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
return 0;
}
g++ -lboost_system -pthread main.cpp