【问题标题】:How to link against cpp-netlib如何链接到 cpp-netlib
【发布时间】:2013-02-09 21:47:08
【问题描述】:

我想将库 cpp-netlib 用于 C++ 项目。因此,我在 homebrew 的帮助下安装了 boost 库(操作系统是 Mac OS X 10.8)。然后我从项目主页下载了cpp-netlib,使用cmake为g++创建了Makefile,并成功应用了make。 “make test”通过了所有的测试。然后我把cpp-netlib的include文件夹复制到boost目录下。

所以这是麻烦开始的时候: 我试图编译文档的第一个示例http-client,但无法让它工作。当我使用

g++ test.cpp -o out -I/usr/local/Cellar/boost/1.53.0/include 
-L/usr/local/Cellar/boost/1.53.0/lib 
-lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt

我收到了这些链接器错误:

Undefined symbols for architecture x86_64:
  "boost::network::uri::detail::parse(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::network::uri::detail::uri_parts<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)", referenced from:
      boost::network::uri::uri::parse()  in ccs87Dq3.o
  "boost::network::http::impl::normal_delegate::normal_delegate(boost::asio::io_service&)", referenced from:
      boost::network::http::impl::connection_delegate_factory<boost::network::http::tags::http_async_8bit_udp_resolve>::new_connection_delegate(boost::asio::io_service&, bool, boost::optional<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::optional<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)in ccs87Dq3.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

我确实使用了搜索功能,但找不到任何解决问题的方法。我究竟做错了什么?

非常感谢!

【问题讨论】:

    标签: c++ boost linker cpp-netlib


    【解决方案1】:

    构建 cpp-netlib (>=0.9.3) 后应该有 3 个静态库:

    libcppnetlib-client-connections.a
    libcppnetlib-server-parsers.a
    libcppnetlib-uri.a
    

    在构建您的 http-client 项目时,您应该指定 cpp-netlib (-L) 的库路径和链接 (-l) 的库:@ 987654322@和libcppnetlib-client-connections

    【讨论】:

    • 感谢您,示例终于可以运行了!如果有人遇到同样的问题:这是(在编译了额外的库之后)最终为我解决问题的那一行:g++ test.cpp -o out -I/usr/local/Cellar/boost/1.53.0/include -L/usr/local/Cellar/boost/1.53.0/lib -lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt -lcppnetlib-client-connections -lcppnetlib-uri -lcppnetlib-server-parsers -lssl -lcrypto跨度>
    【解决方案2】:

    这对我有用。您将需要修改某些部分以处理不同版本的 boost、不同的安装路径等。

    g++ -o demo \
        demo.cpp \
        -lcppnetlib-uri \
        -lcppnetlib-server-parsers \
        -lcppnetlib-client-connections \
        -lboost_thread-mt \
        -lboost_system-mt \
        -lssl \
        -lcrypto \
        -I/usr/local/include \
        -L/usr/local/lib
    

    如果您正在编写服务器端代码,那么我想您还需要包含 -lcppnetlib-server-parsers

    【讨论】:

      【解决方案3】:

      如果有人在使用 Visual Studio 时遇到同样的问题,请将库输入提供给链接器。

      项目属性>链接器>输入>

      libcppnetlib-client-connectionsd.lib
      libcppnetlib-urid.lib
      

      用于调试配置和

      libcppnetlib-client-connections.lib
      libcppnetlib-uri.lib
      

      用于发布配置。

      在此处指定库路径,

      项目属性 > 链接器 > 常规 > 其他包含目录

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多