微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CMake/CLion 初学者的问题:未编译带有 3rd 方库的子目录

如何解决CMake/CLion 初学者的问题:未编译带有 3rd 方库的子目录

所以我尝试开始使用 cmake 有一段时间了。我想使用 here 中的 rpclib。因此,我使用 main.cppCMakeLists.txt 启动了一个新项目,并将 rpclib 作为子目录复制到我的项目中:

我的代码正是来自 rpclib 的示例,如下所示:

#include <iostream>
#include "rpc/server.h"

void foo() {
    std::cout << "foo was called!" << std::endl;
}

int main(int argc,char *argv[]) {
    // Creating a server that listens on port 8080
    rpc::server srv(8080);

    // Binding the name "foo" to free function foo.
    // note: the signature is automatically captured
    srv.bind("foo",&foo);

    // Binding a lambda function to the name "add".
    srv.bind("add",[](int a,int b) {
        return a + b;
    });

    // Run the server loop.
    srv.run();

    return 0;
}

我的 CMakeLists.txt 看起来像这样:

cmake_minimum_required(VERSION 3.16)
project(RPC_Test)

set(CMAKE_CXX_STANDARD 14)

add_subdirectory(rpclib)
include_directories(rpclib/include)

add_executable(RPC_Test main.cpp)

据我所知,add_subdirectory(rpclib) 行负责添加 rpclib 并在构建 RPC_Test-Project 期间构建其内容。看来,我错了。 rpclib 中的任何内容都无法构建,并且构建过程 RPC_Test 因链接错误而失败:

/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/seba/CLionProjects/rpc-cpp/cmake-build-debug-system --target RPC_Test -- -j 3
Scanning dependencies of target RPC_Test
[ 50%] Building CXX object CMakeFiles/RPC_Test.dir/main.cpp.o
[100%] Linking CXX executable RPC_Test
Undefined symbols for architecture x86_64:
  "rpc::detail::dispatcher::enforce_arg_count(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char> > const&,unsigned long,unsigned long)",referenced from:
      void rpc::detail::dispatcher::bind<void (*)()>(std::__1::basic_string<char,void (*)(),rpc::detail::tags::void_result const&,rpc::detail::tags::zero_arg const&)::'lambda'(clmdep_msgpack::v2::object const&)::operator()(clmdep_msgpack::v2::object const&) const in main.cpp.o
      void rpc::detail::dispatcher::bind<main::$_0>(std::__1::basic_string<char,main::$_0,rpc::detail::tags::nonvoid_result const&,rpc::detail::tags::nonzero_arg const&)::'lambda'(clmdep_msgpack::v2::object const&)::operator()(clmdep_msgpack::v2::object const&) const in main.cpp.o
  "rpc::detail::dispatcher::enforce_unique_name(std::__1::basic_string<char,std::__1::allocator<char> > const&)",void (*)()) in main.cpp.o
      void rpc::detail::dispatcher::bind<void (*)()>(std::__1::basic_string<char,rpc::detail::tags::zero_arg const&) in main.cpp.o
      void rpc::detail::dispatcher::bind<main::$_0>(std::__1::basic_string<char,main::$_0) in main.cpp.o
      void rpc::detail::dispatcher::bind<main::$_0>(std::__1::basic_string<char,rpc::detail::tags::nonzero_arg const&) in main.cpp.o
  "rpc::server::run()",referenced from:
      _main in main.cpp.o
  "rpc::server::server(unsigned short)",referenced from:
      _main in main.cpp.o
  "rpc::server::~server()",referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command Failed with exit code 1 (use -v to see invocation)
make[3]: *** [RPC_Test] Error 1
make[2]: *** [CMakeFiles/RPC_Test.dir/all] Error 2
make[1]: *** [CMakeFiles/RPC_Test.dir/rule] Error 2
make: *** [RPC_Test] Error 2

缺少什么?

解决方法

您在 target_link_libraries(RPC_Test PRIVATE rpc) 目标的定义之后缺少 RPC_Testrpc 此处是在 rpclibCMakeLists.txt 中定义的库目标的名称,而不仅仅是生成的二进制工件的基本名称。

当使用带有 target_link_libraries 的目标名称时,CMake 不仅会在链接器调用中添加 -lrpc,还会自动添加使用库所需的包含目录,并确保 {{1} }} 库是在 rpc 之前构建的。特别是,这意味着您还可以在使用 RPC_Test 时删除 include_directories 调用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?