man xkeyboard-config
setxkbmap -layout us,ru
setxkbmap -option 'grp:caps_toggle'
...
# Вместо этой строчки также можно указать путь из командой строки:
# $ 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)
add_executable(
my_target
path/to/generated/file_1
path/to/generated/file_2
)
add_custom_command(
OUTPUT # Файлы, которые генерируем
path/to/generated/file_1
path/to/generated/file_2
COMMAND # Команда генерации
python generate.py
DEPENDS # Файл конфига (CMake должен сам отслеживать изменения этого файла и вызывать COMMAND если это необходимо)
path/to/config.cfg
)
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
)
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
SplitView {
anchors.fill: parent
orientation: Qt.Vertical
SplitView {
anchors.left: parent.left
anchors.right: parent.right
height: parent.height / 2
orientation: Qt.Horizontal
Rectangle {
id: rect1
width: parent.width / 2
onWidthChanged: {rect3.width = width}
color: "lightblue"
}
Rectangle {
id: rect2
width: parent.width / 2
onWidthChanged: {rect4.width = width}
color: "lightgreen"
}
}
SplitView {
anchors.left: parent.left
anchors.right: parent.right
height: parent.height / 2
orientation: Qt.Horizontal
Rectangle {
id: rect3
width: parent.width / 2
onWidthChanged: {rect1.width = width}
color: "blue"
}
Rectangle {
id: rect4
width: parent.width / 2
onWidthChanged: {rect2.width = width}
color: "green"
}
}
}
}
├── qml
│ └── MyItem.qml
└── project
├── main.cpp
├── main.qml
├── qml.qrc
├── project.pro
import "qml" as Common // Просто "qml"; без "../"
Window {
visible: true
width: 640
height: 480
Common.MyItem {
}
}
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define ARRAY_DECLARE(type) \
struct array_##type { \
size_t size; \
size_t capacity; \
type* data; \
}; \
\
struct array_##type* array_##type##_create(size_t init_cap) { \
struct array_##type* self = malloc(sizeof(struct array_##type));\
self->capacity = init_cap; \
self->data = calloc(init_cap, sizeof(type)); \
} \
\
void array_##type##_push_back(struct array_##type* self, type value) { \
if (self->size == self->capacity) { \
type* temp = calloc(self->size + 1, sizeof(type)); \
memmove(temp, self->data, self->size * sizeof(type)); \
free(self->data); \
self->data = temp; \
} \
self->data[self->size++] = value; \
}
ARRAY_DECLARE(int);
ARRAY_DECLARE(float);
int main(void) {
struct array_int* iarr = array_int_create(1);
array_int_push_back(iarr, 42);
array_int_push_back(iarr, 1337);
for (int i = 0; i < 2; ++i) {
printf("%d\n", iarr->data[i]);
}
struct array_float* farr = array_float_create(1);
...
return 0;
}
/* Где-то в array.h */
struct array {
size_t size;
size_t capacity;
void* data;
void (*push_back)(struct array* self, void* value);
void* (*get)(struct array* sefl, size_t index);
};
/* Где-то в arra_int.h */
void array_int_push_back(struct array* self, void* value) {
if (self->size == self->capacity) {
int* temp = calloc(self->size + 1, sizeof(int));
memmove(temp, self->data, self->size * sizeof(int));
free(self->data);
self->data = temp;
}
int* int_data = (int*)self->data;
int_data[self->size++] = *(int*)value;
}
void* array_int_get(struct array* self, size_t index) {
return ((int*)self->data) + index;
}
struct array* array_int_create(size_t init_cap) {
struct array* self = malloc(sizeof(struct array));
self->push_back = array_int_push_back;
self->get = array_int_get;
self->capacity = init_cap;
self->data = calloc(init_cap, sizeof(int));
return self;
}
int main(void) {
struct array* arr = array_int_create(1);
int value = 42;
arr->push_back(arr, &value);
value = 1337;
arr->push_back(arr, &value);
for (int i = 0; i < 2; ++i) {
printf("%d\n", *((int*)arr->get(arr, i)));
}
return 0;
}
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