【问题标题】:Linking a local JSONCpp install with CMake and ExternalProject_Add使用 CMake 和 ExternalProject_Add 链接本地 JSONCpp 安装
【发布时间】:2016-11-26 21:59:39
【问题描述】:

我正在尝试使用 CMake 构建一个使用 JSONCpp 的项目。我想下载 JSONCpp,在本地编译并链接到它。项目结构在单独的位置具有第三方目录的 CMake 文件。我得到两个错误。

  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 &amp;&amp; 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

【问题讨论】:

    标签: c++ cmake jsoncpp


    【解决方案1】:

    默认情况下,命令configure_file所有 次出现的${var_name} 替换为对应变量的值。

    所以它将${jsoncpp_install_prefix}替换为空字符串,因为在调用者的上下文中没有jsoncpp_install_prefix变量。

    如果你只想替换某些变量的引用,你可以使用命令的@ONLY选项,这样只会替换出现的@var_name@,而${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 "@CMAKE_BINARY_DIR@/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)
    

    【讨论】:

    • 谢谢。第二部分是链接器错误。我解决了使用find_package 提示位置并设置include_directories 的问题。
    猜你喜欢
    • 2015-12-26
    • 2021-08-21
    • 2011-09-15
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多