cmake的使用总结
参考链接
https://subingwen.cn/cmake/CMake-primer/
https://subingwen.cn/cmake/CMake-advanced/?highlight=cmake
CMake文件
yh@ubuntu:/Test/jsoncpp$ tree
.
├── build
├── CMakeLists.txt
├── json
│ ├── allocator.h
│ ├── assertions.h
│ ├── config.h
│ ├── forwards.h
│ ├── json_features.h
│ ├── json.h
│ ├── reader.h
│ ├── value.h
│ ├── version.h
│ └── writer.h
├── main.cpp
└── src
├── json_reader.cpp
├── json_tool.h
├── json_value.cpp
├── json_valueiterator.inl
└── json_writer.cpp
3 directories, 17 files
CMakeLists.txt文件
cmake_minimum_required(VERSION 3.5)
project(jsoncpp)
include_directories(${PROJECT_SOURCE_DIR})
file(GLOB LIBRARY_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
#设置静态库和动态库所需的中间文件列表
set(LIBRARY_OBJS_LIST ${PROJECT_NAME}-objs)
add_library(${LIBRARY_OBJS_LIST} OBJECT ${LIBRARY_SRC_LIST})
#开启静态库和动态库所需的中间文件的PIC编译选项
set_target_properties(${LIBRARY_OBJS_LIST} PROPERTIES POSITION_INDEPENDENT_CODE True)
#生成静态库
#设置静态库文件临时名称
set(TMP_STATIC_LIB_NAME ${PROJECT_NAME}-static)
#生成静态库文件
add_library(${TMP_STATIC_LIB_NAME} STATIC $<TARGET_OBJECTS:${LIBRARY_OBJS_LIST}>)
#设置静态库文件的最终名称
set_target_properties(${TMP_STATIC_LIB_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
#生成动态库
#设置动态库文件临时名称
set(TMP_SHARED_LIB_NAME ${PROJECT_NAME}-shared)
#生成动态库文件
add_library(${TMP_SHARED_LIB_NAME} SHARED $<TARGET_OBJECTS:${LIBRARY_OBJS_LIST}>)
#设置动态库文件的最终名称
set_target_properties(${TMP_SHARED_LIB_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
#生成测试文件
add_executable(test${PROJECT_NAME} main.cpp)
target_link_libraries(test${PROJECT_NAME} ${TMP_STATIC_LIB_NAME})
main.cpp
#include <json/json.h>
#include <iostream>
using namespace std;
int main(int argc, const char *argv[])
{
Json::Value root;
Json::FastWriter writer;
Json::StreamWriterBuilder wBuilder;
root["name"] = "张三";
root["age"] = 18;
cerr << writer.write(root) << endl;
std::cout << Json::writeString(wBuilder, root) << std::endl;
return 0;
}
修复jsoncpp1.9.5中的中文被显示为\u的错误
json_writer.cpp第275行
static String valueToQuotedStringN(const char* value, size_t length,
bool emitUTF8 = false)
修改为
static String valueToQuotedStringN(const char* value, size_t length,
bool emitUTF8 = true)
json_writer.cpp第1239行
(*settings)["emitUTF8"] = false;
修改为
(*settings)["emitUTF8"] = true;
Linux下编译步骤
进入build目录开始编译
cd build && cmake .. && make -j8
windows下编译
方式1
cd build
cmake -G "NMake Makefiles" ..
nmake
方式2
#参考https://developer.valvesoftware.com/wiki/Building_without_Visual_Studio#Step_2:_Compiling
cd build
cmake ..
msbuild jsoncpp.sln