首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >示例程序的docopt链接器错误

示例程序的docopt链接器错误
EN

Stack Overflow用户
提问于 2015-10-09 18:49:27
回答 2查看 560关注 0票数 2

我正在尝试从docopt的github页面编译示例代码。不过,我得到了一个链接器错误:

代码语言:javascript
复制
/tmp/test-d3ed6b.o: In function `main':
test.cpp:(.text+0xf3): undefined reference to `docopt::docopt(std::string const&, std::vector<std::string, std::allocator<std::string> > const&, bool, std::string const&, bool)'
test.cpp:(.text+0x1c8): undefined reference to `docopt::operator<<(std::ostream&, docopt::value const&)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我有一个文件test.cpp和一个包含所有docopt文件的目录docopt

test.cpp

代码语言:javascript
复制
#include <iostream>
#include "docopt/docopt.h"

static const char USAGE[] =
R"(Naval Fate.

Usage:
naval_fate ship new <name>...
naval_fate ship <name> move <x> <y> [--speed=<kn>]
naval_fate ship shoot <x> <y>
naval_fate mine (set|remove) <x> <y> [--moored | --drifting]
naval_fate (-h | --help)
naval_fate --version

Options:
-h --help     Show this screen.
--version     Show version.
--speed=<kn>  Speed in knots [default: 10].
--moored      Moored (anchored) mine.
--drifting    Drifting mine.
)";

int main(int argc, const char** argv)
{
    std::map<std::string, docopt::value> args
    = docopt::docopt(USAGE,
                     { argv + 1, argv + argc },
                     true,               // show help if requested
                     "Naval Fate 2.0");  // version string

    for(auto const& arg : args) {
        std::cout << arg.first <<  arg.second << std::endl;
    }

    return 0;
}

这个错误是怎么回事?我怎么才能修复它呢?我试过clang-3.5和g++

EN

回答 2

Stack Overflow用户

发布于 2016-08-24 09:16:17

我也遇到了这个问题。

我使用cmake和我的CMakeLists.txt中的一些特定配置解决了这个问题。以下配置适用于我:

代码语言:javascript
复制
cmake_minimum_required (VERSION 3.5)
project(my_project)
include(ExternalProject)

set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )

set(DOCOPT_ROOT ${PROJECT_SOURCE_DIR}/external/docopt)
set(DOCOPT_INCLUDE_DIRS ${DOCOPT_ROOT}/include/docopt)
set(DOCOPT_LIBRARIES ${DOCOPT_ROOT}/lib/libdocopt.a)
set(docopt_INSTALL_DIR "${DOCOPT_ROOT}")
set(docopt_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${docopt_INSTALL_DIR})

ExternalProject_Add(docopt
  PREFIX ${DOCOPT_ROOT}
  GIT_REPOSITORY https://github.com/docopt/docopt.cpp.git
  BINARY_DIR ${DOCOPT_ROOT}
  INSTALL_DIR ${DOCOPT_ROOT}
  CMAKE_ARGS ${docopt_CMAKE_ARGS}
  LOG_DOWNLOAD ON
  LOG_CONFIGURE ON
  LOG_BUILD ON
  LOG_INSTALL ON
)
add_library(libdocopt STATIC IMPORTED)
set_target_properties(libdocopt PROPERTIES IMPORTED_LOCATION ${DOCOPT_LIBRARIES})
add_dependencies(libdocopt docopt)

include_directories(${PROJECT_SOURCE_DIR})
include_directories(${DOCOPT_INCLUDE_DIRS})

file(GLOB projector_src
  "*.h"
  "*.cpp"
  )

add_executable(my_project ${my_project_src})
target_link_libraries(projector libdocopt)

显然,您不需要使用cmake,但是您需要将docopt.cpp的源代码放入您自己的代码中,否则您需要告诉链接器在哪里查找它。cmake确实为您解决了这一点,但这是另一件需要担心的事情。

票数 1
EN

Stack Overflow用户

发布于 2017-08-14 21:51:02

修改了Jeremiah的答案,使其独立于任何其他来源。

项目结构:

代码语言:javascript
复制
├── CMakeLists.txt
├── build
└── main.cpp

CMakeLists.txt

代码语言:javascript
复制
cmake_minimum_required (VERSION 3.5)
project(my_project)
include(ExternalProject)

set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )

set(DOCOPT_ROOT ${PROJECT_SOURCE_DIR}/external/docopt)
set(DOCOPT_INCLUDE_DIRS ${DOCOPT_ROOT}/include/docopt)
set(DOCOPT_LIBRARIES ${DOCOPT_ROOT}/lib/libdocopt.a)
set(docopt_INSTALL_DIR "${DOCOPT_ROOT}")
set(docopt_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${docopt_INSTALL_DIR})

ExternalProject_Add(docopt
  PREFIX ${DOCOPT_ROOT}
  GIT_REPOSITORY https://github.com/docopt/docopt.cpp.git
  BINARY_DIR ${DOCOPT_ROOT}
  INSTALL_DIR ${DOCOPT_ROOT}
  CMAKE_ARGS ${docopt_CMAKE_ARGS}
  LOG_DOWNLOAD ON
  LOG_CONFIGURE ON
  LOG_BUILD ON
  LOG_INSTALL ON
)

add_library(libdocopt STATIC IMPORTED)
set_target_properties(libdocopt PROPERTIES IMPORTED_LOCATION ${DOCOPT_LIBRARIES})
add_dependencies(libdocopt docopt)

include_directories(${PROJECT_SOURCE_DIR})
include_directories(${DOCOPT_INCLUDE_DIRS})

file(GLOB src
  "*.h"
  "*.cpp"
  )

add_executable(my_project ${src})
target_link_libraries(my_project libdocopt)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33036333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档