make install指定目标目录的两种方法

方法一:对于大多数工程,特别是cmake生成的工程,只需要执行下列命令

make DESTDIR=/install/directory install

方法二:少数工程(如源码安装git)发现用方法1实际上安装到了/install/directory//home/username 目录,即用户根目录,这是因为Makefile内部已经设置了一遍安装目标目录,手工设置的目录仅仅作为了一个前缀。

打开Makefile文件,发现有如下代码(就在最顶端)

prefix = (HOME) bindir =(prefix)/bin
mandir = (prefix)/share/man infodir =(prefix)/share/info
gitexecdir = libexec/git-core
mergetoolsdir = (gitexecdir)/mergetools sharedir =(prefix)/share
gitwebdir = (sharedir)/gitweb perllibdir =(sharedir)/perl5
localedir = (sharedir)/locale template_dir = share/git-core/templates htmldir =(prefix)/share/doc/git-doc
ETC_GITCONFIG = (sysconfdir)/gitconfig ETC_GITATTRIBUTES =(sysconfdir)/gitattributes

修改第一行prefix 对应目录即可。

Install OpenMP in MacOS : Cannot find gcc option –without-multilib

I want to install OpenMP in my MacOS system, and there are plenty of tutorials about how to install OpenMP. Unfortunately, most of them cannot work on my computer. We I try to use  brew reinstall gcc –without-multilib ,the –without-multilib  Option seems not be well supported.

Warning: gcc: this formula has no --without-multilib option so it will be ignored!
brew options gcc
--with-jit
        Build just-in-time compiler
--with-nls
        Build with native language support (localization)
--HEAD
        Install HEAD version

I still do not know why this happens, may be caused by the newer MacOS, but we can use another approach mentions in  Clang + OpenMP Setup in macOS

Firstly, we use brew install llvm  to install llvm. In my system clang & clang++ was installed into /usr/local/opt/llvm/bin and be overlapped by original clang , We use the soft link to create an alias of new clang.

ln -s /usr/local/opt/llvm/bin/clang /usr/local/bin/clang-omp
ln -s /usr/local/opt/llvm/bin/clang++ /usr/local/bin/clang-omp++

The openmp then works in my computer, we can use  clang-omp++ main.cpp -o main -fopenmp to compile an openmp program.

MacOS 使用 OpenMP : gcc没有–without-multilib选项解决方案

网络上已经有很多通过brew安装openmp的教程,其中大部分都用的是brew reinstall gcc –without-multilib 。但是,当我使用brew options gcc 命令查看gcc的可用开关,发现并没有–without-multilib 这样的选项。

brew options gcc
--with-jit
        Build just-in-time compiler
--with-nls
        Build with native language support (localization)
--HEAD
        Install HEAD version

这个错误的具体原因仍然不知道,可能是mac系统版本的问题,不过参考 Clang + OpenMP Setup in macOS,可以知道,在Mac中对于OpenMP的支持,已经内置到了llvm中,于是得到如下的解决方式:

首先使用brew install llvm 安装llvm,在我的电脑中,发现llvm的clang & clang++ 安装到了/usr/local/opt/llvm/bin 位置,但是被系统默认的clang 覆盖了。因此我们可以将omp使用的clang软连接来重命名。

ln -s /usr/local/opt/llvm/bin/clang /usr/local/bin/clang-omp
ln -s /usr/local/opt/llvm/bin/clang++ /usr/local/bin/clang-omp++

这样我们就成功实现了Mac系统安装OpenMP,通过clang-omp++ main.cpp -o main -fopenmp测试成功。

 

通过jsoncpp库的CharReaderBuilder解析字符串

jsoncpp安装

jsoncpp是C++用来解析json语言使用的库。可以直接在github上面clone下来。

clone下来的jsoncpp包含CMakeLists.txt,也就是说我们可以使用标准的cmake安装方法:

mkdir build
cd build
cmake ..
make
make install

如果你使用了make install ,那么在工程CMakeLists.txt中,可以使用

find_package(jsoncpp REQUIRED)
target_link_libraries(main jsoncpp)

安装,另一方面,如果直接将jsoncpp放在了工程目录中,那么CMakeLists.txt可以如下引用:

add_subdirectory(jsoncpp)
target_link_libraries(main jsoncpp_lib_static)

CharReaderBuilder的使用

大部分网上的教程都使用了jsoncpp的Reader类,新版的jsoncpp已经废弃了之该类,编译的时候出现如下警告:

note: 'Reader' has been explicitly marked deprecated here
  JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead")
  ^
note: expanded from macro 'JSONCPP_DEPRECATED'
#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))

我们来看看建议的CharReader 和CharReaderBuilder 该怎么用吧。

首先,CharReader 是一个虚类,是用于自定义解析格式的Reader,我们这里并不能使用。而CharReaderBuilder 则可以直接使用,具体格式也很简单,直接通过一个小程序解释吧:

#include <iostream>
#include "json/json.h"
#include <fstream>

using namespace std;

int main()
{
        std::ifstream ifs("configures/config.json");
        Json::CharReaderBuilder reader;
        Json::Value root;
        JSONCPP_STRING errs;
        Json::parseFromStream(reader, ifs, &root, &errs);
        cout<<root["haha"].asInt()<<endl;
        cout<<root["haha"]["lala"].asInt()<<endl;
}

之后的Json::Value 就和更新前的一样,支持字符串下标索引(用于字典),整数下标索引(用于列表)和asInt() 类基本数据类型转换函数。