Travis CI 사용

github를 사용하다가 얼마전부터 Travis CI 를 연동해서 사용해보기로 했다.

외부 라이브러리를 전혀 쓰지 않게 되어있는 URLParser는 빌드에 어려움이 없었지만, 외부라이브러리를 가져다 쓰는 DServer는 빌드에 애로사항이 많았다.

빌드명령어는 https://arne-mertz.de/2017/04/continuous-integration-travis-ci/ 를 참조했다.

일단 나는 CentOS에서만 빌드하고 테스트했었기 때문에 Travis CI가 빌드에 사용하는 Ubuntu 리눅스에 맞추도록 해야했다.

일단 사용했던 라이브러리인 jemalloc 에서부터 에러가 났다. VS2015에 라이브러리를 빌드할 수 있는 모든 파일들이 포함되어 있긴했지만 이걸 또 빌드하려면 여러가지 명령을 넣어야하는 상황. 구글을 뒤져서 travis에서 빌드전 libjemalloc-dev 패키지를 설치하도록 추가했다.

다시 빌드하려고 하니 이번엔 json 패키지에서 에러가 났다. 역시 모든 파일이 포함되어 있지만 이걸 빌드하기에는 복잡하니 다시 라이브러리를 추가하도록 했다.

우분투에서 패키지 검색은

sudo apt-cache search [패키지명]

를 사용하면 된다.

빌드전 설치 패키지에 libjsoncpp-dev 를 추가한다. 이것만으로 안되서 libjson0 libjson0-dev 도 추가했다. 이제 다시 빌드하면…

기대도 안했지만 역시 에러난다. boost 관련 에러가 뜬다. 그런데 boost가 어떤 패키지에 담겨있는지 알수가 없는 상황.

https://docs.travis-ci.com/user/build-environment-updates/2017-11-01/

를 보니 boost 1.65가 있다고는 한다. 결국에는 apt-cache search 명령으로 패키지 목록을 찾아냈다. 2018년 12월 26일 기준으로 boost 와 관련된 라이브러리 목록은 다음과 같다.

before_install.1
0.28s$ sudo apt-cache search boost
libboost-chrono-dev - C++ representation of time duration, time point, and clocks (default version)
libboost-date-time-dev - set of date-time libraries based on generic programming concepts (default version)
libboost-dbg - Boost C++ Libraries with debug symbols (default version)
libboost-dev - Boost C++ Libraries development files (default version)
libboost-doc - Boost.org libraries documentation (default version)
libboost-filesystem-dev - filesystem operations (portable paths, iteration over directories, etc) in C++ (default version)
libboost-iostreams-dev - Boost.Iostreams Library development files (default version)
libboost-program-options-dev - program options library for C++ (default version)
libboost-python-dev - Boost.Python Library development files (default version)
libboost-regex-dev - regular expression library for C++ (default version)
libboost-serialization-dev - serialization library for C++ (default version)
libboost-system-dev - Operating system (e.g. diagnostics support) library (default version)
libboost-test-dev - components for writing and executing test suites (default version)
libboost-thread-dev - portable C++ multi-threading (default version)
libboost-all-dev - Boost C++ Libraries development files (ALL) (default version)
libboost-atomic-dev - atomic data types, operations, and memory ordering constraints (default version)
libboost-atomic1.55-dev - atomic data types, operations, and memory ordering constraints
libboost-atomic1.55.0 - atomic data types, operations, and memory ordering constraints
libboost-chrono1.55-dev - C++ representation of time duration, time point, and clocks
libboost-chrono1.55.0 - C++ representation of time duration, time point, and clocks
libboost-context-dev - provides a sort of cooperative multitasking on a single thread (default version)
libboost-context1.55-dev - provides a sort of cooperative multitasking on a single thread
libboost-context1.55.0 - provides a sort of cooperative multitasking on a single thread
libboost-coroutine-dev - provides a sort of cooperative multitasking on a single thread (default version)
libboost-coroutine1.55-dev - provides a sort of cooperative multitasking on a single thread
libboost-date-time1.55-dev - set of date-time libraries based on generic programming concepts
libboost-date-time1.55.0 - set of date-time libraries based on generic programming concepts
libboost-exception-dev - library to help write exceptions and handlers (default version)
libboost-exception1.55-dev - library to help write exceptions and handlers
libboost-filesystem1.55-dev - filesystem operations (portable paths, iteration over directories, etc) in C++
libboost-filesystem1.55.0 - filesystem operations (portable paths, iteration over directories, etc) in C++
libboost-geometry-utils-perl - Perl module providing bindings to the Boost Geometry library
libboost-graph-dev - generic graph components and algorithms in C++ (default version)
libboost-graph-parallel-dev - generic graph components and algorithms in C++ (default version)
libboost-graph-parallel1.55-dev - generic graph components and algorithms in C++
libboost-graph-parallel1.55.0 - generic graph components and algorithms in C++
libboost-graph1.55-dev - generic graph components and algorithms in C++
libboost-graph1.55.0 - generic graph components and algorithms in C++
libboost-iostreams1.55-dev - Boost.Iostreams Library development files
libboost-iostreams1.55.0 - Boost.Iostreams Library
libboost-locale-dev - C++ facilities for localization (default version)
libboost-locale1.55-dev - C++ facilities for localization
libboost-locale1.55.0 - C++ facilities for localization
libboost-log-dev - C++ logging library (default version)
libboost-log1.55-dev - C++ logging library
libboost-log1.55.0 - C++ logging library
libboost-math-dev - Boost.Math Library development files (default version)
libboost-math1.55-dev - Boost.Math Library development files
libboost-math1.55.0 - Boost.Math Library
libboost-mpi-dev - C++ interface to the Message Passing Interface (MPI) (default version)
libboost-mpi-python-dev - C++ interface to the Message Passing Interface (MPI), Python Bindings (default version)
libboost-mpi-python1.55-dev - C++ interface to the Message Passing Interface (MPI), Python Bindings
libboost-mpi-python1.55.0 - C++ interface to the Message Passing Interface (MPI), Python Bindings
libboost-mpi1.55-dev - C++ interface to the Message Passing Interface (MPI)
libboost-mpi1.55.0 - C++ interface to the Message Passing Interface (MPI)
libboost-program-options1.55-dev - program options library for C++
libboost-program-options1.55.0 - program options library for C++
libboost-python1.55-dev - Boost.Python Library development files
libboost-python1.55.0 - Boost.Python Library
libboost-random-dev - Boost Random Number Library (default version)
libboost-random1.55-dev - Boost Random Number Library
libboost-random1.55.0 - Boost Random Number Library
libboost-regex1.55-dev - regular expression library for C++
libboost-regex1.55.0 - regular expression library for C++
libboost-serialization1.55-dev - serialization library for C++
libboost-serialization1.55.0 - serialization library for C++
libboost-signals-dev - managed signals and slots library for C++ (default version)
libboost-signals1.55-dev - managed signals and slots library for C++
libboost-signals1.55.0 - managed signals and slots library for C++
libboost-system1.55-dev - Operating system (e.g. diagnostics support) library
libboost-system1.55.0 - Operating system (e.g. diagnostics support) library
libboost-test1.55-dev - components for writing and executing test suites
libboost-test1.55.0 - components for writing and executing test suites
libboost-thread1.55-dev - portable C++ multi-threading
libboost-thread1.55.0 - portable C++ multi-threading
libboost-timer-dev - C++ wall clock and CPU process timers (default version)
libboost-timer1.55-dev - C++ wall clock and CPU process timers
libboost-timer1.55.0 - C++ wall clock and CPU process timers
libboost-tools-dev - Boost C++ Libraries development tools (default version)
libboost-wave-dev - C99/C++ preprocessor library (default version)
libboost-wave1.55-dev - C99/C++ preprocessor library
libboost-wave1.55.0 - C99/C++ preprocessor library
libboost1.55-all-dev - Boost C++ Libraries development files (ALL)
libboost1.55-dbg - Boost C++ Libraries with debug symbols
libboost1.55-dev - Boost C++ Libraries development files
libboost1.55-doc - Boost.org libraries documentation
libboost1.55-tools-dev - Boost C++ Libraries development tools
libjson-spirit-dev - C++ JSON Parser/Generator implemented with Boost Spirit
pianobooster - learn the piano just by playing a game
pianobooster-dbg - learn the piano just by playing a game - debug
python-minieigen - Small boost::python wrapper of parts of the Eigen library
python-py++ - OO-framework for creating a code generator for Boost.Python
r-cran-gbm - GNU R package "Generalized Boosted Regression Models"
libboost-atomic1.54-dev - atomic data types, operations, and memory ordering constraints
libboost-atomic1.54.0 - atomic data types, operations, and memory ordering constraints
libboost-chrono1.54-dev - C++ representation of time duration, time point, and clocks
libboost-chrono1.54.0 - C++ representation of time duration, time point, and clocks
libboost-date-time1.54-dev - set of date-time libraries based on generic programming concepts
libboost-date-time1.54.0 - set of date-time libraries based on generic programming concepts
libboost-filesystem1.54-dev - filesystem operations (portable paths, iteration over directories, etc) in C++
libboost-filesystem1.54.0 - filesystem operations (portable paths, iteration over directories, etc) in C++
libboost-iostreams1.54-dev - Boost.Iostreams Library development files
libboost-iostreams1.54.0 - Boost.Iostreams Library
libboost-program-options1.54-dev - program options library for C++
libboost-program-options1.54.0 - program options library for C++
libboost-python1.54-dev - Boost.Python Library development files
libboost-python1.54.0 - Boost.Python Library
libboost-regex1.54-dev - regular expression library for C++
libboost-regex1.54.0 - regular expression library for C++
libboost-serialization1.54-dev - serialization library for C++
libboost-serialization1.54.0 - serialization library for C++
libboost-system1.54-dev - Operating system (e.g. diagnostics support) library
libboost-system1.54.0 - Operating system (e.g. diagnostics support) library
libboost-test1.54-dev - components for writing and executing test suites
libboost-test1.54.0 - components for writing and executing test suites
libboost-thread1.54-dev - portable C++ multi-threading
libboost-thread1.54.0 - portable C++ multi-threading
libboost1.54-dbg - Boost C++ Libraries with debug symbols
libboost1.54-dev - Boost C++ Libraries development files
libboost1.54-doc - Boost.org libraries documentation
libboost1.54-tools-dev - Boost C++ Libraries development tools
libboost-context1.54-dev - provides a sort of cooperative multitasking on a single thread
libboost-context1.54.0 - provides a sort of cooperative multitasking on a single thread
libboost-coroutine1.54-dev - provides a sort of cooperative multitasking on a single thread
libboost-exception1.54-dev - library to help write exceptions and handlers
libboost-graph-parallel1.54-dev - generic graph components and algorithms in C++
libboost-graph-parallel1.54.0 - generic graph components and algorithms in C++
libboost-graph1.54-dev - generic graph components and algorithms in C++
libboost-graph1.54.0 - generic graph components and algorithms in C++
libboost-locale1.54-dev - C++ facilities for localization
libboost-locale1.54.0 - C++ facilities for localization
libboost-log1.54-dev - C++ logging library
libboost-log1.54.0 - C++ logging library
libboost-math1.54-dev - Boost.Math Library development files
libboost-math1.54.0 - Boost.Math Library
libboost-mpi-python1.54-dev - C++ interface to the Message Passing Interface (MPI), Python Bindings
libboost-mpi-python1.54.0 - C++ interface to the Message Passing Interface (MPI), Python Bindings
libboost-mpi1.54-dev - C++ interface to the Message Passing Interface (MPI)
libboost-mpi1.54.0 - C++ interface to the Message Passing Interface (MPI)
libboost-random1.54-dev - Boost Random Number Library
libboost-random1.54.0 - Boost Random Number Library
libboost-signals1.54-dev - managed signals and slots library for C++
libboost-signals1.54.0 - managed signals and slots library for C++
libboost-timer1.54-dev - C++ wall clock and CPU process timers
libboost-timer1.54.0 - C++ wall clock and CPU process timers
libboost-wave1.54-dev - C99/C++ preprocessor library
libboost-wave1.54.0 - C99/C++ preprocessor library
libboost1.54-all-dev - Boost C++ Libraries development files (ALL)

libboost-dev를 설치하고 보니 이번에는 mysql 라이브러리가 잡히지 않아서 또 에러. 검색해보니 오늘 날짜 기준으로 mysql 관련 라이브러리는 다음과 같았다.

before_install.1
0.30s$ sudo apt-cache search mysql
bacula-common-mysql - network backup service - MySQL common files
bacula-common-mysql-dbg - network backup service - MySQL common files (debugging)
bacula-director-mysql - network backup service - MySQL storage for Director
bacula-director-mysql-dbg - network backup service - MySQL storage for Director (debugging)
bacula-sd-mysql - network backup service - MySQL SD tools
bacula-sd-mysql-dbg - network backup service - MySQL SD tools (debugging)
libapache2-mod-auth-mysql - Apache 2 module for MySQL authentication
libdatetime-format-mysql-perl - Parse and format MySQL dates and times
libdbd-mysql - MySQL database server driver for libdbi
libmysqlcppconn-dev - MySQL Connector for C++ (development files)
libmysqlcppconn7 - MySQL Connector for C++ (library)
python-mysqldb - Python interface to MySQL
python-mysqldb-dbg - Python interface to MySQL (debug extension)
aolserver4-nsmysql - AOLserver 4 module: module for accessing MySQL databases
asterisk-mysql - MySQL database protocol support for the Asterisk PBX
cl-sql-mysql - CLSQL database backend, MySQL
courier-authlib-mysql - MySQL support for the Courier authentication library
cvm-mysql - Credential Validation Modules (MySQL)
dbf2mysql - xBase <--> MySQL
dpm-copy-server-mysql - DPM copy server with MySQL database backend
dpm-name-server-mysql - DPM nameserver server with MySQL database backend
dpm-server-mysql - Disk Pool Manager (DPM) server with MySQL database backend
dpm-srm-server-mysql - DPM SRM server with MySQL database backend
dpsyco-mysql - Automate administration of access to mysql
dsyslog-module-mysql - advanced modular syslog daemon - MySQL support
emma - extendable MySQL managing assistant
falconpl-dbi-mysql - MySQL database abstraction layer for Falcon P.L
gambas3-gb-db-mysql - MySQL driver for the Gambas database component
gambas3-gb-mysql - Gambas MySQL component
gmysqlcc - graphical client for managing MySQL databases
gnokii-smsd-mysql - SMSD plugin for MySQL storage backend
gsql-mysql-engine - MySQL engine for GSQL
handlersocket-mysql-5.5 - HandlerSocket plugin for MySQL 5.5
kamailio-mysql-modules - MySQL database connectivity module for Kamailio
kexi-mysql-driver - MySQL support for kexi
letodms - document management system based on PHP and MySQL
lfc-server-mysql - LCG File Catalog (LFC) server with MySQL database backend
libapache2-mod-log-sql-mysql - Use SQL to store/write your Apache queries logs - MySQL interface
libaprutil1-dbd-mysql - Apache Portable Runtime Utility Library - MySQL Driver
libclass-dbi-mysql-perl - extensions to Class::DBI for MySQL
libcrypt-mysql-perl - Perl module to emulate the MySQL PASSWORD() function
libdbd-mysql-ruby - Transitional package for ruby-dbd-mysql
libdbd-mysql-ruby1.8 - Transitional package for ruby-dbd-mysql
libdbd-mysql-ruby1.9.1 - Transitional package for ruby-dbd-mysql
libdbix-fulltextsearch-perl - Indexing documents with MySQL as storage
libdspam7-drv-mysql - MySQL backend for DSPAM anti-spam filter
libgda-5.0-mysql - MySQL provider for libgda database abstraction library
libghc-hsql-mysql-dev - MySQL driver of the HSQL library for GHC
libghc-hsql-mysql-doc - API documentation of the hsql-mysql library for Haskell
libghc-hsql-mysql-prof - MySQL driver of the HSQL library for GHC; profiling libraries
libkaya-mysql-dev - MySQL binding for kaya
libmyodbc - the MySQL ODBC driver
libmysql++-dev - MySQL C++ library bindings (development)
libmysql++-doc - MySQL C++ library bindings (documentation and examples)
libmysql++3 - MySQL C++ library bindings (runtime)
libmysql-cil-dev - MySQL database connector for CLI
libmysql-diff-perl - module for comparing the table structure of two MySQL databases
libmysql-java - Java database (JDBC) driver for MySQL
libmysql-ocaml - OCaml bindings for MySql (runtime package)
libmysql-ocaml-dev - OCaml bindings for MySql (development package)
libmysql6.4-cil - MySQL database connector for CLI
libnss-mysql-bg - NSS module for using MySQL as a naming service
libopendbx1-mysql - MySQL backend for OpenDBX
libpam-mysql - PAM module allowing authentication from a MySQL server
librdf-storage-mysql - RDF library, MySQL backend
libtime-piece-mysql-perl - module adding MySQL-specific methods to Time::Piece
libwtdbomysql-dev - MySQL/MariaDB backend for Wt::Dbo [development]
libwtdbomysql35 - MySQL/MariaDB backend for Wt::Dbo [runtime]
lighttpd-mod-mysql-vhost - MySQL-based virtual host configuration for lighttpd
lua-dbi-mysql - DBI library for the Lua language, MySQL backend
lua-dbi-mysql-dbg - DBI library for the Lua language, MySQL backend debug symbols
lua-dbi-mysql-dev - DBI library for the Lua language, MySQL development files
lua-sql-mysql - luasql library for the Lua language
lua-sql-mysql-dev - luasql development files for the Lua language
mha4mysql-manager - Master High Availability Manager and Tools for MySQL, Manager Package
mha4mysql-node - Master High Availability Manager and Tools for MySQL, Node Package
monodoc-mysql-manual - compiled XML documentation for the MySql.Data library
mydumper - High-performance MySQL backup tool
mylvmbackup - quickly creating backups of MySQL server's data files
mysql-mmm-agent - Multi-Master Replication Manager for MySQL - agent daemon
mysql-mmm-common - Multi-Master Replication Manager for MySQL - common files
mysql-mmm-monitor - Multi-Master Replication Manager for MySQL - monitoring daemon
mysql-mmm-tools - Multi-Master Replication Manager for MySQL - tools
mysql-proxy - high availability, load balancing and query modification for mysql
mysql-utilities - collection of scripts for managing MySQL servers
mysql-workbench - MySQL Workbench - a visual database modeling, administration and queuing tool
mysql-workbench-data - MySQL Workbench -- architecture independent data
mysqltcl - interface to the MySQL database for the Tcl language
mysqltuner - high-performance MySQL tuning script
mysqmail - real-time logging system in MySQL
mysqmail-courier-logger - real-time logging system in MySQL - Courier traffic-logger
mysqmail-dovecot-logger - real-time logging system in MySQL - Dovecot traffic-logger
mysqmail-postfix-logger - real-time logging system in MySQL - Postfix traffic-logger
mysqmail-pure-ftpd-logger - real-time logging system in MySQL - Pure-FTPd traffic-logger
mytop - top like query monitor for MySQL
ndoutils-nagios3-mysql - This provides the NDOUtils for Nagios with MySQL support
node-mysql - MySQL client implementation for Node.js
nuauth-log-mysql - The authenticating firewall [MySQL log module]
oar-server-mysql - OAR batch scheduler MySQL server backend package
oar-user-mysql - OAR batch scheduler MySQL user backend package
opendnssec-dbg-mysql - Debug symbols for OpenDNSSEC (Enforcer with MySQL support)
opendnssec-enforcer-mysql - tool to prepare DNSSEC keys (mysql backend)
parser3-mysql - MySQL driver for Parser 3
pennmush-mysql - text-based multi-user virtual world server with MySQL support
percona-toolkit - Command-line tools for MySQL and system tasks
perdition-mysql - Library to allow perdition to access MySQL based popmaps
php-mdb2-driver-mysql - PHP PEAR module to provide a MySQL driver for MDB2
php5-mysqlnd-ms - MySQL replication and load balancing module for PHP
pike7.8-mysql - MySQL modules for Pike
postfix-cluebringer-mysql - metapackage for mysql support in postfix-cluebringer
postfix-gld - greylisting daemon for postfix, written in C, uses MySQL
puppet-module-puppetlabs-mysql - Puppet module for mysql
python-mysql.connector - pure Python implementation of MySQL Client/Server protocol
python3-mysql.connector - pure Python implementation of MySQL Client/Server protocol (Python3)
r-cran-rmysql - GNU R package providing a DBI-compliant interface to MySQL
ratbox-services-mysql - IRC services for use with ircd-ratbox with the mysql backend
redmine-mysql - metapackage providing MySQL dependencies for Redmine
root-plugin-sql-mysql - MySQL client plugin for ROOT
roundcube-mysql - metapackage providing MySQL dependencies for RoundCube
rt4-db-mysql - MySQL database backend for request-tracker4
ruby-dataobjects-mysql - MySQL adapter for ruby-dataobjects
ruby-dbd-mysql - Ruby/DBI MySQL driver
ruby-mysql - MySQL module for Ruby
ruby-mysql2 - simple, fast MySQL library for Ruby
spl-mysql - SPL Programming Language -- MySQL adapter
tarantool-mysql-plugin - Tarantool in-memory database - MySQL connector
tcl8.6-tdbc-mysql - Tcl Database Connectivity
tntdb-mysql4 - MySQL backend for tntdb database access library
ukolovnik - Simple todo manager using PHP and MySQL
ulogd-mysql - transitional dummy package for ulogd2-mysql
ulogd2-mysql - MySQL extension to ulogd
voms-mysql-plugin - VOMS server plugin for MySQL
voms-mysql-plugin-dbg - VOMS server plugin for MySQL - Debug Symbols
yate-mysql - MySQL support module for yate
zabbix-proxy-mysql - network monitoring solution - proxy (using MySQL)
zabbix-server-mysql - network monitoring solution - server (using MySQL)
exim4-daemon-heavy - Exim MTA (v4) daemon with extended features, including exiscan-acl
libdbd-mysql-perl - Perl5 database interface to the MySQL database
libmysqlclient-dev - MySQL database development files
libmysqlclient18 - MySQL database client library
libmysqld-dev - MySQL embedded database development files
libqt4-sql-mysql - Qt 4 MySQL database driver
libreoffice-base-drivers - Database connectvity drivers for LibreOffice
mysql-client - MySQL database client (metapackage depending on the latest version)
mysql-client-5.5 - MySQL database client binaries
mysql-client-core-5.5 - MySQL database core client binaries
mysql-common - MySQL database common files, e.g. /etc/mysql/my.cnf
mysql-server - MySQL database server (metapackage depending on the latest version)
mysql-server-5.5 - MySQL database server binaries and system database setup
mysql-server-core-5.5 - MySQL database server binaries
nova-api - OpenStack Compute - API frontend
nova-cert - OpenStack Compute - certificate management
nova-common - OpenStack Compute - common files
nova-compute - OpenStack Compute - compute node base
nova-compute-kvm - OpenStack Compute - compute node (KVM)
nova-compute-libvirt - OpenStack Compute - compute node libvirt support
nova-compute-lxc - OpenStack Compute - compute node (LXC)
nova-doc - OpenStack Compute - documentation
nova-network - OpenStack Compute - Network manager
nova-objectstore - OpenStack Compute - object store
nova-scheduler - OpenStack Compute - virtual machine scheduler
nova-volume - OpenStack Compute - storage
php5-mysql - MySQL module for php5
php5-sqlite - SQLite module for php5
postfix-mysql - MySQL map support for Postfix
python-nova - OpenStack Compute Python libraries
rsyslog - reliable system and kernel logging daemon
strongswan-plugin-mysql - strongSwan plugin for MySQL
strongswan-plugin-sql - strongSwan plugin for SQL configuration and credentials
akonadi-backend-mysql - MySQL storage backend for Akonadi
automysqlbackup - daily, weekly and monthly backup for your MySQL database
cacti - web interface for graphing of monitoring systems
collectd-core - statistics collection and monitoring daemon (core system)
dovecot-mysql - secure POP3/IMAP server - MySQL support
drizzle - Server binaries for Drizzle Database
drizzle-client - Client binaries for Drizzle Database
drizzle-dbg - Debugging symbols for Drizzle
drizzle-dev-doc - API Documentation for drizzle
drizzle-doc - Documentation for Drizzle
drizzle-plugin-auth-file - File-based authentication for Drizzle
drizzle-plugin-auth-http - HTTP authentication for Drizzle
drizzle-plugin-auth-ldap - LDAP authentication for Drizzle
drizzle-plugin-auth-pam - PAM authentication for Drizzle
drizzle-plugin-auth-schema - Schema authentication for Drizzle
drizzle-plugin-debug - Plugin that facilitates debugging Drizzle
drizzle-plugin-dev - Development files for Drizzle plugin development
drizzle-plugin-gearman-udf - Gearman User Defined Functions for Drizzle
drizzle-plugin-http-functions - HTTP Functions for Drizzle
drizzle-plugin-js - Javascript plugin for Drizzle
drizzle-plugin-json-server - JSON HTTP (NoSQL) interface for Drizzle
drizzle-plugin-logging-gearman - Gearman Logging for Drizzle
drizzle-plugin-logging-query - Query Logging for Drizzle
drizzle-plugin-perf-dictionary - Performance Dictionary for Drizzle
drizzle-plugin-query-log - Query logging for Drizzle
drizzle-plugin-rabbitmq - RabbitMQ Transaction Log for Drizzle
drizzle-plugin-regex-policy - Regex based authorization rules for Drizzle
drizzle-plugin-simple-user-policy - Simple User Policy for Drizzle
drizzle-plugin-slave - Replication Slave Plugin for Drizzle
freeradius-mysql - MySQL module for FreeRADIUS server
gnash-ext-mysql - GNU Shockwave Flash (SWF) player - MySQL extension
libdrizzle-dbg - library for the Drizzle and MySQL protocols, debug symbols
libdrizzle-dev - library for the Drizzle and MySQL protocols, development files
libdrizzle4 - library for the Drizzle and MySQL protocols
libdrizzledmessage-dev - Devel library containing serialized messages used with Drizzle
libdrizzledmessage0 - Library containing serialized messages used with Drizzle
libmariadbclient-dev - MariaDB database development files
libmariadbd-dev - MariaDB embedded database development files
libmysqld-pic - PIC version of MySQL embedded server development files
libphp-adodb - ADOdb database abstraction layer for PHP
libpocomysql9 - C++ Portable Components (POCO) MySQL library
libpocomysql9-dbg - C++ Portable Components (POCO) MySQL library (debug version)
libqt5sql5-mysql - Qt 5 MySQL database driver
libreoffice-mysql-connector - MariaDB/MySQL Connector extension for LibreOffice
libtango8 - TANGO distributed control system - shared library
libtango8-dbg - TANGO distributed control system - debug library
libtango8-dev - TANGO distributed control system - development library
libtango8-doc - TANGO distributed control system - documentation
mariadb-client-5.5 - MariaDB database client binaries
mariadb-client-core-5.5 - MariaDB database core client binaries
mariadb-server-5.5 - MariaDB database server binaries
mariadb-server-core-5.5 - MariaDB database core server files
mariadb-test-5.5 - MariaDB database regression test suite
mysql-client-5.6 - MySQL database client binaries
mysql-client-core-5.6 - MySQL database core client binaries
mysql-common-5.6 - MySQL 5.6 specific common files, e.g. /etc/mysql/conf.d/my-5.6.cnf
mysql-server-5.6 - MySQL database server binaries and system database setup
mysql-server-core-5.6 - MySQL database server binaries
mysql-source-5.5 - MySQL source
mysql-source-5.6 - MySQL source
mysql-testsuite - MySQL testsuite
mysql-testsuite-5.5 - MySQL testsuite
mysql-testsuite-5.6 - MySQL 5.6 testsuite
nova-ajax-console-proxy - OpenStack Compute - AJAX console proxy - transitional package
nova-api-ec2 - OpenStack Compute - EC2 API frontend
nova-baremetal - Openstack Compute - baremetal virt
nova-cells - Openstack Compute - cells
nova-compute-qemu - OpenStack Compute - compute node (QEmu)
nova-compute-vmware - OpenStack Compute - compute node (VMware)
nova-compute-xen - OpenStack Compute - compute node (Xen)
nova-conductor - OpenStack Compute - conductor service
nova-console - OpenStack Compute - Console
nova-consoleauth - OpenStack Compute - Console Authenticator
nova-novncproxy - OpenStack Compute - NoVNC proxy
nova-spiceproxy - OpenStack Compute - spice html5 proxy
nova-xvpvncproxy - OpenStack Compute - XVP VNC proxy
owncloud - empty package
pdns-backend-mysql - generic MySQL backend for PowerDNS
percona-xtradb-cluster-client-5.5 - Percona Server database client binaries
percona-xtradb-cluster-common-5.5 - Percona Server database common files
percona-xtradb-cluster-server-5.5 - Percona Server database server binaries
percona-xtradb-cluster-testsuite-5.5 - Percona Server database test suite
php5-mysqlnd - MySQL module for php5 (Native Driver)
phpmyadmin - MySQL web administration tool
pinba-engine-mysql-5.5 - realtime statistics server for PHP using MySQL as a read-only interface
proftpd-mod-mysql - Versatile, virtual-hosting FTP daemon - MySQL module
pure-ftpd-mysql - Secure and efficient FTP server with MySQL user authentication
rsyslog-mysql - MySQL output plugin for rsyslog
tango-db - TANGO distributed control system - database server
viewvc-query - utility to query CVS and Subversion commit database
mythtv-database - Personal video recorder application (database)
cl-pgloader - extract, transform and load data into PostgreSQL
cl-qmynd - MySQL Native Driver for Common Lisp
pgloader - extract, transform and load data into PostgreSQL
postgresql-10-mysql-fdw - Postgres 10 Foreign Data Wrapper for MySQL
postgresql-11-mysql-fdw - Postgres 11 Foreign Data Wrapper for MySQL
postgresql-9.3-mysql-fdw - Postgres 9.3 Foreign Data Wrapper for MySQL
postgresql-9.4-mysql-fdw - Postgres 9.4 Foreign Data Wrapper for MySQL
postgresql-9.5-mysql-fdw - Postgres 9.5 Foreign Data Wrapper for MySQL
postgresql-9.6-mysql-fdw - Postgres 9.6 Foreign Data Wrapper for MySQL
postgresql-mysql-fdw-doc - documentation for mysql-fdw

이 중에서 libmysqlcppconn-dev, libmysqlcppconn7, libmysql++-dev, libmysql++3 이렇게 4개의 패키지를 추가했다.

다시 빌드해보니… 안된다.

이번에는 tchar.h 에러. 이건 윈도우에만 있는 헤더… 문제는 MSSQL 관련 파일들이었다. 윈도우에서만 사용되도록 define 해주고 다시 커밋.

이 이외에도 무수히 많은 에러를 수정하며 지나가야했다. git-flow로 아예 브랜치를 별도로 만들어서 처리해나갔다.

  • strncpy_s 문제 : MS 전용이다. strncpy 로 함수 변경
  • boost::filesystem::ofstream을 std::ofstream으로 변경 : 함수 인자를 모두 수정해주어야 한다. 두 함수는 이름은 같지만 인자의 타입이 다르다.
  • __super 사용 금지 : MS 전용이다. gcc에서는 __super 사용 금지. typedef로 기본클래스를 지정해서 사용해야한다. ( https://goo.gl/hSeG97 )
  • 몇군데 rvalue reference에 대한 수정도 필요했다.

여기까지 수정했음에도 여전히 많은 오류에 부딪혔다.

결국 리눅스 빌드는 나중에 해보기로 하고 윈도우에서 빌드를 시작하는 것으로…

AppVeyor 사용기

Travis-CI 에서 윈도우 빌드가 되지 않아 고민하던 중…

새로운 CI 서비스를 찾았다. AppVeyor인데 앱베요인지 앱비요인지 앱베이요인지 뭐라고 읽어야할지 잘 모르겠다. 이 서비스는 Travis-CI와 같은 리눅스 빌드 외에도 윈도우에서 VisualStudio를 통한 빌드를 지원한다.

Appveyor는 Travis-CI처럼 yml 파일로도 설정해줄 수 있지만 웹사이트에서 바로 설정을 수정할 수 있기 때문에 아무래도 사용하기가 많이 편리했다.

Boost 라이브러리는 프로젝트 속성에 절대경로로 지정하던 것을 윈도우 시스템 환경변수로 뺐고, appveyor 에서는 프로젝트 설정에 환경변수로 넣어주었다.

MySQL 커넥터 라이브러리에서도 충돌이 생겼는데, appveyor 에는 MySQL ODBC 드라이버만 지원하고 있었다. 나는 리눅스에서도 빌드되게 하려고 따로 MySQL-C++-Connector를 사용하고 있다. 일단 이 라이브러리를 솔루션에 포함시키는 것으로 해결했다. 차후에는 ODBC 버전까지 같이 지원하도록 만드는 것이 나을 것 같다.

boost와 mysql을 해결하고 json과 jemalloc 라이브러리가 먼저 빌드되고 그다음 유틸리티 라이브러리, 네트워크 라이브러리 순서로 빌드하기 위해 솔루션 설정에서 프로젝트 종속성을 설정해주었다.

다시 빌드하자….

게임서버, 브릿지서버 둘다 빌드 성공.

확실히 GCC나 G++를 이용하는 빌드보다는 훨씬 쉬운 느낌이다.

Google Breakpad 설치 (2)

gyp 파일을 다 실행하고 나면 솔루션 파일과 프로젝트 파일 등이 생겨난다. 비주얼스튜디오로 솔루션 파일을 열어보면 다음과 같이 여러개의 프로젝트가 솔루션 안에 들어있다.

K-007

맨 밑에 build_all 프로젝트를 빌드해보면…

84개의 오류와 28개의 경고로 빌드가 안된다. 뭐 어차피 기대도 안했다.

에러메시지를 보면

#include "testing/gtest/include/gtest/gtest.h"
#include "testing/include/gmock/gmock.h"

이 부분에서부터 에러가 시작된다. gtest와 gmock이 필요하다고 한다. 이건 아마 외부라이브러리인 모양.

이 패키지들은 https://github.com/google/googletest 에서 받을 수 있다. 이 레포지토리를 git으로 클론한다. 다운로드 받으면 googlemock과 googletest다 들어있으며, 각 디렉토리에 msvc 라는 디렉토리가 있고 여기에 비주얼스튜디오로 열 수 있는 솔루션 파일과 프로젝트 파일들이 들어있다.

솔루션 파일들을 열어서 실행해보면 .lib 파일들이 생성된다. 이것들은 지금 당장은 필요 없다.

 

이제 이 파일들을 구조에 맞게 넣어줘야한다. 이걸 어떻게 해야하는지 몰라서 한참 찾았다.

https://github.com/Mendeley/breakpad

이 사람이 디렉토리 구조를 이미 만들어서 넣어놨길래 그대로 참고했다. (아마 이 사람은 브레이크패드에 맞도록 모든 라이브러리 파일을 다 넣어서 올려놓은듯하다. 이 소스를 받아다가 사용하면 잘될꺼 같기도하다.)

여기서부터 문제가 있는데, googlemock과 googletest 디렉토리를 구글브레이크패드 폴더에 복사해넣어줘야 한다. 그런데 내 경우에는, 회사컴퓨터에서 할 때와, 내 컴퓨터에서 했을 때 경로가 달랐다.

회사컴퓨터에서는… 구글 브레이크패드 디렉토리 중 src 디렉토리 밑에 testing 디렉토리를 만들고 거기에 googlemock 디렉토리 내용 전체를 복사해서 넣는다. 그리고 src/testing 디렉토리 밑에 gtest 디렉토리를 만들고 거기에는 googletest 디렉토리 내용 전체를 복사해서 넣는다.

집 컴퓨터에서는… 구글 브레이크 패드 디렉토리 중 src 디렉토리 밑에 testing 디렉토리를 만들고 거기에 googlemock과 googletest 디렉토리 두개를 그대로 복사해넣었다.

 

이제 구글 브레이크패드 솔루션 파일을 열고 build_all 프로젝트를 빌드해보면…

안된다.

 

오류가 난다. 오류내용은

C4091 'typedef ': 변수를 선언하지 않으면 '' 왼쪽은 무시됩니다.
C2220 경고가 오류로 처리되어 생성된 'object' 파일이 없습니다.

해당 코드는 다음과 같이 되어있다.

typedef enum {
    hdBase = 0, // root directory for dbghelp
    hdSym,      // where symbols are stored
    hdSrc,      // where source is stored
    hdMax       // end marker
};

enum인데 이름이 정의되지 않은 상태로 typedef가 되었기 때문에 나는 에러이다.

이걸 검색해보니 다음과 같은 내용을 찾았다.

https://stackoverflow.com/questions/913344/how-can-i-remove-the-vs-warning-c4091-typedef-ignored-on-left-of-spreadsh

typedef를 그냥 삭제해버리랜다. 삭제하려고 봤더니…

이 오류가 나는건, C:\Program Files (x86)\Windows Kits\8.1\Include\um\DbgHelp.h 파일이었다. C++ 라이브러리를 수정할 수는 없는 노릇… ‘프로젝트 속성’의 ‘구성 속성’ -> ‘C/C++’ -> ‘고급’을 찾아가 ‘특정 경고 사용 안 함’ 에 4091을 추가했다. 이제 빌드가 된다.

같은 에러가 나는 프로젝트를 찾아서 전부 위처럼 4091 에러에 대한 경고무시를 설정해줘야한다.

이렇게 또 build_all 을 해봤더니 또 오류가 난다.

프로젝트 중 unittests 에 있는 processor_bits 프로젝트가 계속 에러가 나는 것이었다. 경고를 전부 오류 처리해버리기에 빌드가 되지 않았다. 이것도 4091 에러처럼 4267, 4366 을 경고무시에 추가한다.

이제 다시 build_all 프로젝트를 빌드해본다.

또 오류가 난다.

unittest 에 있는 client_tests 프로젝트에서 에러가 났다. 마찬가지로 경고를 오류로 처리해서 나는 에러. 4389, 4312, 4267 을 경고무시로 넣어준다.

다시 build_all 프로젝트를 빌드해본다.

드디어 아무 에러 없이 성공.

이제 빌드된 구글브레이크패드를 이용해서 실제 사용하는 방법을 찾아봐야겠다.

C++에서 엑셀파일 처리하기

C++에서 엑셀파일을 다루는 법을 찾아보았다.

2012년도에 엑셀 파일을 처리할 방법을 찾다가 https://blog.dongbumkim.com/archives/754 이런 글을 썼었는데 이제는 그보다 더 나은 방법을 찾을 수 있었다.

예전에 작업하던 소스에서는 ODBC를 이용하여 연결했었는데 왠일인지 이 방법으로는 제대로 연결되지 않았다. 당시에는 잘 작동하던 소스였는데…

찾아보니 윈도우 버전이 올라가며 제대로 작동하지 않는듯하다.(확실히 끝까지 찾아보지는 못했다.) ADO 등의 다른 방법으로 연결하는 것을 안내하고 있었다.

웹서핑을 하며 엑셀 파일을 다룰 수 있는 라이브러리를 찾아보다가 스택오버플로우에서 xlnt 라는 라이브러리를 추천해줘서 한번 테스트해보았다.

https://github.com/tfussell/xlnt

무려 크로스플랫폼의 C++14에 맞춘 xlsx 파일 처리 가능한 라이브러리라고 설명이 되어있다.

처음에는 잘 작동하는듯했으나… 오 잘되네 하고 본격적인 테스트코드를 만들다보니 버그가 있었다. 시트를 하나 더 추가해서 2개의 시트를 만들고 컬럼을 추가하면 에러가 떴다. 엑셀 파일을 아무리 봐도 문제가 없어 검색해봤더니 이미 버그리포팅이 되어있던 이슈. 나도 가서 한마디 거들었다.

https://github.com/tfussell/xlnt/issues/330#issuecomment-440589168

xlnt로 하루 넘는 시간을 날리고 다시 검색해보니 ExcelFormat 라이브러리를 추천했다. 이것으로 작업을 성공적으로 했다는 댓글도 있어서 이걸로 결정.

https://www.codeproject.com/Articles/42504/ExcelFormat-Library

사용해보니 다른 외부 컴포넌트 없이 바로 사용 가능했다.

단점은,

  • xlsx는 지원하지 않고 xls 파일만 지원한다.
  • 데이터를 가져올 각 셀마다 데이터타입을 정확하게 지정해줘야한다.
  • 그런데 숫자만 들어있는 셀은 전부다 double 형으로 데이터를 가져온다. int로 캐스팅해야함.
    for (int k = 0; k < sheet->GetTotalRows(); ++k)
    {
        for (int j = 0; j < sheet->GetTotalCols(); ++j)
        {
            ExcelFormat::BasicExcelCell* cell = sheet->Cell(k, j);
            switch (cell->Type())
            {
            case ExcelFormat::BasicExcelCell::INT:
                std::cout << "INT:" << cell->GetInteger() << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::DOUBLE:
                std::cout << "DOUBLE:" << static_cast<int>(cell->GetDouble()) << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::STRING:
                std::cout << "STRING:" << cell->GetString() << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::WSTRING:
                std::cout << "WSTRING:" << cell->GetWString() << std::endl;
                break;
            case ExcelFormat::BasicExcelCell::UNDEFINED:
            case ExcelFormat::BasicExcelCell::FORMULA:
            default:
                break;
            }
        }
    }
  • 암호 걸린 엑셀파일은 처리 불가능하다.

테스트 코드를 열심히 작성해봤더니 시트가 여러개일때도, 데이터가 꽤 많을 때에도 데이터 처리가 무난했다.

사용했던 테스트 코드의 일부.

class DataTableMgr
{
private:
	ExcelFormat::BasicExcel xls;
};

bool DataTableMgr::LoadWeaponBombTable(void)
{
    ExcelFormat::BasicExcelWorksheet* sheet = nullptr;
    
    for (int i = 0; i < xls.GetTotalWorkSheets(); ++i)
    {
        sheet = xls.GetWorksheet(i);
        if (nullptr == sheet)
            continue;

        if (!strcmp(WEAPONBOM_SHEETNAME, sheet->GetAnsiSheetName()))
        {
            sheet = xls.GetWorksheet(i);
            break;
        }
    }

    if (nullptr == sheet)
        return false;

    // 첫행은 컬럼 인덱스이므로 항상 패쓰
    for (int i = 1; i < sheet->GetTotalRows(); ++i)
    {
        DATATABLE_WEAPONBOMB weapon_bomb;
        weapon_bomb.index = static_cast<int>(sheet->Cell(i, 0)->GetDouble());
        weapon_bomb.id = static_cast<int>(sheet->Cell(i, 1)->GetDouble());
        weapon_bomb.id_5pack = static_cast<int>(sheet->Cell(i, 2)->GetDouble());
        weapon_bomb.id_11pack = static_cast<int>(sheet->Cell(i, 3)->GetDouble());
        weapon_bomb.itemid = static_cast<int>(sheet->Cell(i, 4)->GetDouble());

        weapon_bomb_map.insert(DATATABLE_WEAPONBOMB_MAP::value_type(weapon_bomb.index, weapon_bomb));
    }

    std::cout << "WeaponBomb count : " << weapon_bomb_map.size() << std::endl;

    return true;
}

코드 자체는 잘 작동했지만, static 데이터를 엑셀 파일로 관리하는 것에 대해 위험함이 제기 되어 이 프로젝트는 무산되었다. ㅎㅎㅎ 나중에 언젠가는 쓸 일이 있겠지.

Windows에서 Jenkins 설치하기

CentOS에서 Jenkins를 설치하는 글을 썼었는데 이제는 윈도우에서 설치해보기로 했다.

Jenkins 홈페이지에 보면 젠킨스를 여러가지 버전으로 제공하고 있다. 각 운영체제에 맞도록 인스톨러를 제공하고 있다. 톰캣 따로 설치해서 설정하는게 귀찮아서 그냥 Windows Stable Installer 버전으로 다운로드 받고 설치한다.

http://127.0.0.1:8080 에 접속해보면 젠킨스 화면이 나온다.

빨강색 글씨에 있는 경로를 찾아사 initialAdminPassword 의 암호를 입력해준다. Setup Wizard가 실행되면 따라서 진행한다. 플러그인을 수동으로 선택하여 설치할지 추천하는 플러그인을 설치할지 나오는데 난 그냥 귀찮아서 제안하는대로 설치했다.

플러그인을 잠시 설치하고 나면 관리자 계정을 생성한다. 관리자 계정까지 생성하고 나면 http://localhost:8080/ 로 들어가면 젠킨스가 실행된다.

 

2019년 3월 6일 추가

윈도우용 톰캣을 설치하고 webapps 디렉토리에 jenkins.war 파일을 넣고 실행하면 위와 같은 화면이 나오지만 initialAdminPassword 파일의 경로가 다르다.

C:\WINDOWS\system32\config\systemprofile\.jenkins\secrets\initialAdminPassword

이 경로의 파일을 요구하게 된다. 하지만 이 경로에 들어가봐도 이 파일은 존재하지 않는다.

이런 경우에는 로그 파일을 찾아봐야 한다. jenkins 디렉토리에서 logs 디렉토리로 간다음 catalina 로그파일을 열어서 password 로 검색해보면 생성된 암호를 찾을 수 있었다.

Visual Studio에서 jemalloc 설치하고 사용법 (3)

jemalloc 라이브러리가 정상 작동하므로 솔루션에 포함되어 있는 test_threads 프로젝트를 빌드해본다.

별 설정 없이도 잘 빌드되고 실행된다.

….만, 이게 도대체 뭔 내용인지는 나도 잘 모르겠다. test_threads.cpp 파일에는 테스트용 코드가 잔뜩 있다. 다 읽어보기도 힘들어서 읽어보다가 관둿다. 대략 je_malloc, je_free 등의 함수를 이용하는 예제코드인 것 같다.

github에는 간단한 예제코드가 있다. ( https://github.com/jemalloc/jemalloc/wiki/Getting-Started )

….는 별로 도움이 되지 않았다.

그냥 쉽게 얘기하면 new/malloc 을 할 때 je_malloc 을 하면 되고 delete/free 를 할 때 je_free 를 하라면 되는 말.

그래서 new와 delete를 오버라이딩하는 클래스를 만든다.

new 를 사용하는 곳에서 이 오버라이딩 클래스를 상속 받게 해주면 끝.

그리고 헤더에서 #include <jemalloc/jemalloc.h> 를 넣어주고 추가 포함 디렉터리에는 jemalloc의 include 디렉토리를 지정해주고 빌드하면 된다.

이렇게하면 빌드가 성공하고 실행파일에 있는 위치에 jemalloc 빌드 후 생성된 .dll 파일을 같이 넣어주면 된다.

….인줄 알았는데 빌드가 안된다.

코드를 보니 jemalloc.h 파일에서

#include <string.h> 부분이 문제가 되었다. 이 문제에 대해 찾아보니…

https://stackoverflow.com/questions/15512790/error-about-finding-strings-h-in-htmlcxx

아마 유닉스쪽에서 쓰는 헤더파일일 거라고 한다.

해당 부분을

#ifdef _WIN32
#include <string.h> 
#else
#include <strings.h>
#endif

로 교체하면 잘 작동한다.

프로젝트의 구성속성을 보면 Debug, Debug-static 식으로 나뉘어 있는데, 전자는 .dll 파일을 쓰는 동적 링크, 후자는 .lib 파일을 쓰는 정적 링크이다. 각자 원하는 것으로 사용.

Visual Studio에서 jemalloc 설치하고 사용법 (2)

이 글은 jemalloc 을 설치하다가 애먹은 경험으로 쓰는 것. 혹시 나처럼 Visual Studio에서 jemalloc을 쓰려고 고생하는 사람들에게 도움이 되길 바란다. 그리고 퍼갈 때에는 출처도 밝혀주시기를…

일단 https://github.com/jemalloc/jemalloc 에서 소스코드를 Clone 한다. (내 경우에는 D:\Library\jemalloc 으로 다운로드했다.)

master 브랜치를 다운로드하고 안에 들어가서 살펴보면 msvc 라는 디렉토리가 있고 그 안에 jemalloc_vc2015.sln 파일이 있다. Visual Studio 2015용 솔루션이 있으니 얼마나 감사한가.

솔루션을 열어보면 이미 jemalloc 프로젝트와 test_threads 프로젝트가 추가되어있다.

jemalloc 프로젝트를 빌드해보면…

C1083 포함 파일을 열 수 없습니다. 'jemalloc/internal/jemalloc_preamble.h': No such file or directory jemalloc d:\library\jemalloc\src\witness.c 2
오류와 함께 빌드가 되지 않는다. 실제로 저 경로에 가서 살펴보면 jemalloc_preamble.h 파일이 없다.

솔루션 파일에 추가되어 있는 ReadMe.txt 파일을 열어보면 다음과 같은 내용이 있다.
How to build jemalloc for Windows
=================================

1. Install Cygwin with at least the following packages:
* autoconf
* autogen
* gawk
* grep
* sed

2. Install Visual Studio 2015 with Visual C++

3. Add Cygwin\bin to the PATH environment variable

4. Open "VS2015 x86 Native Tools Command Prompt"
(note: x86/x64 doesn't matter at this point)

5. Generate header files:
sh -c "CC=cl ./autogen.sh"

6. Now the project can be opened and built in Visual Studio:
msvc\jemalloc_vc2015.sln

메뉴얼이 있으니 따라가야지.

Cygwin을 구글에서 검색해서 설치한다. Cygwin 설치법은 검색해서 찾자.

하나 참고해둘 것은 Cygwin은 설치프로그램을 실행해서 구성파일을 인터넷에서 다운로드하며 설치한다. 근데 이 과정이 무지막지하게 느리다. 기가인터넷이고 지랄이고 이런거 소용 없더라. 미러를 선택할 때 ftp.kaist.ac.kr을 선택했지만 그래도 느리다. 한참 설치하더니 몇가지 패키지가 설치 안되었다고 나온다. 설치프로그램을 다시 실행시켜서 미러를 ftp.jaist.ac.jp 로 바꾸고 다시 설치. 이 과정을 몇번 반복해서야 겨우 설치 완료했다.

Cygwin을 디폴트로 설치하고나서 설치프로그램의 검색창을 이용해 위 메뉴얼에 있는 autoconf, autogen, gawk, grep, sed를 설치해줘야 한다. 잊지말것.

아마 Cygwin을 처음 보거나 잘 쓰지 않는 사람이라면 이 과정에서 굉장히 스트레스 받을 것이다. 나도 Cygwin 설치에만 하루 넘게 걸렸다. 젠장…

이걸 설치하고 나서는 메뉴얼대로 제어판을 열고 ‘시스템’의 ‘고급 시스템 설정’의 ‘환경 변수’에 가서 ‘변수’ 중 Path 항목의 값에 Cygwin의 bin 경로를 추가해준다. 내 경우에는 C:\cygwin64\bin 을 추가해줬다.

이제 시작메뉴에서 ‘VS2015 x64 네이티브 도구 명령 프롬프트’를 실행한다.

경로를 jemalloc이 설치된 폴더로 이동한다. 내 경우에는 D:\Library\jemalloc 으로.

메뉴얼에 있는대로 sh -c “CC=cl ./autogen.sh” 를 입력한다.

각종 환경설정 사항을 체크하고 컴파일 과정이 지나간다. (다중프로세서 컴파일은 하지 않는듯하다. 적당히 웹서핑하며 몇분 기다리면 된다.)

이 화면이 나오면 컴파일이 끝난 것이다.

아까 jemalloc_preamble.h 파일이 없던 경로에 가보면 jemalloc_preamble.h 파일이 생성되어 있다.

이제 다시 Visual Studio 2015를 켜서 솔루션을 열고 jemalloc 프로젝트를 빌드해본다.

당연히 잘된다. ㅎㅎㅎ

결론 : Cygwin을 설치하는게 제일 애먹었다. 이것만 설치하고 나머지는 메뉴얼대로 설정하면 된다.

tcmalloc 은 왜 VS2015, VS2017에서 안될까…

tcmalloc 을 사용하기 위해 일주일 이상 삽질하다 알게된 내용.

tcmalloc은 Visual Studio 2015에서 디버그 모드로 사용이 불가능하다. 힙과 관련하여 Assertion이 뜰 때가 있다. 프로그램이 크래쉬나는 것도 아니고 중지되는 것도 아니고 화면이 멈춘듯한 현상이 발생.

물론, Visual Studio 2017에서도 디버그 모드로 사용이 불가능하다.

하지만 릴리즈모드로는 잘 작동한다.

Visual Studio 2017로 간단한 코드를 테스트하여 tcmalloc의 성능을 확인해보았다.

확실히 성능으 더 낫지만 기대했던 것만큼 드라마틱한 성능향상은 아니었다. 아마 멀티스레드라면 더 성능격차가 벌어질듯하다.

C++에서 사용 가능한 암호화 라이브러리

새로운 게임서버를 만들면서 C++에서 사용가능한 암호화 라이브러리를 찾아보았다.

내가 사용 예정 중인건 2번의 Crypto++.

Boost에서 기본으로 암호화 라이브러리를 지원해주면 좋을텐데 뭐 할수 없지.

디버그 정보가 없는 것처럼 개체를 링크합니다. 에러 수정

비주얼스튜디오에서 라이브러리 프로젝트로 프로젝트 컴파일시 다음과 같은 에러가 발생하는 경우,

1>------ 모두 다시 빌드 시작: 프로젝트: GameServer, 구성: Debug x64 ------
1>  game_protocol.cpp
1>  main.cpp
1>  game_server.cpp
1>  코드를 생성하고 있습니다...
1>     D:\Work\DServer2.git\vs_solution\Lib\GameServer64D.lib 라이브러리 및 D:\Work\DServer2.git\vs_solution\Lib\GameServer64D.exp 개체를 생성하고 있습니다.
1>DServer64D.lib(basic_socket.obj) : warning LNK4099: 'DServer.pdb' PDB를 'DServer64D.lib(basic_socket.obj)' 또는 'D:\Work\DServer2.git\vs_solution\Lib\DServer.pdb'에서 찾을 수 없습니다. 디버그 정보가 없는 것처럼 개체를 링크합니다.
1>DServer64D.lib(config.obj) : warning LNK4099: 'DServer.pdb' PDB를 'DServer64D.lib(config.obj)' 또는 'D:\Work\DServer2.git\vs_solution\Lib\DServer.pdb'에서 찾을 수 없습니다. 디버그 정보가 없는 것처럼 개체를 링크합니다.
1>DServer64D.lib(log_manager.obj) : warning LNK4099: 'DServer.pdb' PDB를 'DServer64D.lib(log_manager.obj)' 또는 'D:\Work\DServer2.git\vs_solution\Lib\DServer.pdb'에서 찾을 수 없습니다. 디버그 정보가 없는 것처럼 개체를 링크합니다.
1>DServer64D.lib(base_protocol.obj) : warning LNK4099: 'DServer.pdb' PDB를 'DServer64D.lib(base_protocol.obj)' 또는 'D:\Work\DServer2.git\vs_solution\Lib\DServer.pdb'에서 찾을 수 없습니다. 디버그 정보가 없는 것처럼 개체를 링크합니다.
1>  GameServer.vcxproj -> D:\Work\DServer2.git\vs_solution\Lib\GameServer64D.exe
1>  GameServer.vcxproj -> D:\Work\DServer2.git\vs_solution\Lib\GameServer64D.pdb (Full PDB)
========== 모두 다시 빌드: 성공 1, 실패 0, 생략 0 ==========

사실 프로그램 작동에는 문제가 없지만 나중에 디버깅시에 문제가 된다.

http://shaeod.tistory.com/411 를 참조해서 해결 완료.

문제 해결 방법은

  1. “구성 속성” -> “C/C++” -> “일반” -> “디버그 정보 형식” : “프로그램 데이터베이스(/Zi)” 로 수정
  2. “구성 속성” -> “C/C++” -> “코드 생성” -> “최소 다시 빌드 가능” : “아니요(/Gm-)”로 수정
  3. “구성 속성” -> “C/C++” -> “명령줄” -> “추가 옵션”에 “/Ylsymbol”를 입력

하면 해결된다.