Я пытаюсь использовать CMake для создания проекта, который использует JSONCpp. Я хочу загрузить JSONCpp, скомпилировать его локально и связать с ним. Структура проекта имеет файлы CMake для сторонних каталогов в отдельном месте. Я получаю две ошибки.Связывание локальной установки JSONCpp с CMake и ExternalProject_Add
- Процесс CMake пытается установить файл по всему миру, и я не могу идентифицировать переменную CMake, чтобы установить ее локально или нет, чтобы установить ее вообще.
- Когда я запускаю make, компоновщик не может найти libjsoncpp, хотя я попытался установить все переменные, которые я мог бы указать ему в правильном направлении.
Кто-нибудь знает, как отключить попытку глобальной установки? Как указать компоновщик в нужное место в переносном режиме?
Структура проекта я использую:
./jsoncpp_build_test.cc
./third_party/CMakeLists.txt.jsoncpp
./third_party/CMakeLists.txt
./CMakeLists.txt
Исходный файл jsoncpp_build_test
является:
#include <iostream>
#include "json/json.h"
int main(int argc, char **argv) {
Json::Value json_doc;
std::cout << json_doc.asString() << std::endl;
return 0;
}
Основной ./CMakeLists.txt
файл.
project(jsontest CXX C)
cmake_minimum_required(VERSION 2.8.12)
add_subdirectory(third_party)
set(jsoncpp_lib_dir ${CMAKE_BINARY_DIR}/jsoncpp-build/src/lib_json)
set(jsoncpp_src_dir ${CMAKE_BINARY_DIR}/jsoncpp-src/include)
add_executable(jsoncpp_build_test "jsoncpp_build_test.cc")
target_include_directories(jsoncpp_build_test PRIVATE ${jsoncpp_src_dir})
target_include_directories(jsoncpp_build_test PRIVATE ${jsoncpp_lib_dir})
target_link_libraries(jsoncpp_build_test jsoncpp)
third_party/CMakeLists.txt
файл. Я пытался загрузить JSONCpp и установить его, чтобы пользователь не запускал несколько команд, связанных с сборкой.
configure_file(CMakeLists.txt.jsoncpp
jsoncpp/CMakeLists.txt)
set(jsoncpp_work_dir "${CMAKE_BINARY_DIR}/third_party/jsoncpp")
set(jsoncpp_build_dir "${CMAKE_BINARY_DIR}/jsoncpp-build")
set(jsoncpp_lib_dir "${CMAKE_BINARY_DIR}/jsoncpp-lib")
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
WORKING_DIRECTORY ${jsoncpp_work_dir})
message(STATUS "INSTALL DIR is ${CMAKE_INSTALL_PREFIX}")
set(CMAKE_INSTALL_COMPONENT "${CMAKE_BINARY_DIR}/jsoncpp-lib")
message(STATUS "INSTALL COMPONENT is ${CMAKE_INSTALL_COMPONENT}")
execute_process(COMMAND ${CMAKE_COMMAND} --build .
WORKING_DIRECTORY ${jsoncpp_work_dir})
Наконец, third_party/CMakeLists.txt.json
файл, который использует модуль ExternalProject_Add.
cmake_minimum_required(VERSION 2.8.12)
project(jsoncpp-download NONE)
set(jsoncpp_install_prefix "${CMAKE_BINARY_DIR}/jsoncpp-lib")
set(CMAKE_INSTALL_COMPONENT "${jsoncpp_install_prefix}")
include(ExternalProject)
ExternalProject_Add(jsoncpp-parser
GIT_REPOSITORY https://github.com/open-source-parsers/jsoncpp.git
GIT_TAG master
SOURCE_DIR "${CMAKE_BINARY_DIR}/jsoncpp-src"
BINARY_DIR "${CMAKE_BINARY_DIR}/jsoncpp-build"
INSTALL_DIR "${CMAKE_BINARY_DIR}/jsoncpp-lib"
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${jsoncpp_install_prefix}"
)
Результат cd build && cmake ../
приведен ниже. Однако я не хочу устанавливать jsoncpp глобально.
-- The CXX compiler identification is GNU 4.8.4
-- The C compiler identification is GNU 4.8.4
...
[100%] Built target jsoncpp_test
[ 87%] Performing install step for 'jsoncpp-parser'
[ 50%] Built target jsoncpp_lib_static
[ 66%] Built target jsontestrunner_exe
[100%] Built target jsoncpp_test
Install the project...
-- Install configuration: "Release"
CMake Error at cmake_install.cmake:44 (FILE):
file cannot create directory: /lib/pkgconfig. Maybe need administrative privileges.
make[3]: *** [install] Error 1
make[2]: *** [jsoncpp-parser-prefix/src/jsoncpp-parser-stamp/jsoncpp-parser-install] Error 2
make[1]: *** [CMakeFiles/jsoncpp-parser.dir/all] Error 2
make: *** [all] Error 2
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/cmake_test/build
Результат make
является:
Scanning dependencies of target jsoncpp_build_test
[100%] Building CXX object
CMakeFiles/jsoncpp_build_test.dir/jsoncpp_build_test.cc.o
Linking CXX executable jsoncpp_build_test
/usr/bin/ld: cannot find -ljsoncpp
collect2: error: ld returned 1 exit status
make[2]: *** [jsoncpp_build_test] Error 1
make[1]: *** [CMakeFiles/jsoncpp_build_test.dir/all] Error 2
make: *** [all] Error 2
Спасибо. Вторая часть была ошибкой компоновщика. Я решил, что с помощью 'find_package' с подсказкой к местоположению и установкой' include_directories'. –