2016-07-22 2 views
0

Я пытаюсь использовать CMake для создания проекта, который использует JSONCpp. Я хочу загрузить JSONCpp, скомпилировать его локально и связать с ним. Структура проекта имеет файлы CMake для сторонних каталогов в отдельном месте. Я получаю две ошибки.Связывание локальной установки JSONCpp с CMake и ExternalProject_Add

  1. Процесс CMake пытается установить файл по всему миру, и я не могу идентифицировать переменную CMake, чтобы установить ее локально или нет, чтобы установить ее вообще.
  2. Когда я запускаю 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 

ответ

0

По умолчанию команда configure_file заменяет все вхождений ${var_name} со значением переменной соответствующей ее.

Так он заменяет ${jsoncpp_install_prefix} с пустой строкой, потому что нет jsoncpp_install_prefix переменной контекста вызывающей.

Если вы хотите заменить только ссылки на какой-либо переменной, вы можете использовать опцию @ONLY команды, так что только @[email protected] вхождение будет заменяет, но ${var_name} воля остается неизменной:

THIRD_PARTY/CMakeLists.txt.json :

cmake_minimum_required(VERSION 2.8.12) 
project(jsoncpp-download NONE) 
# This reference will be replaced when configured 
set(jsoncpp_install_prefix "@[email protected]/jsoncpp-lib") 
# But this reference remains unchanged, until resulted CMakeLists.txt will be interpreted. 
set(CMAKE_INSTALL_COMPONENT "${jsoncpp_install_prefix}") 
... 

THIRD_PARTY/CMakeLists.txt

configure_file(CMakeLists.txt.json 
    jsoncpp/CMakeLists.txt 
    @ONLY) 
+0

Спасибо. Вторая часть была ошибкой компоновщика. Я решил, что с помощью 'find_package' с подсказкой к местоположению и установкой' include_directories'. –

 Смежные вопросы

  • Нет связанных вопросов^_^