Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake/CLion初学者';s问题:包含第三方库的子目录未编译_C++_Cmake_External Library - Fatal编程技术网

C++ CMake/CLion初学者';s问题:包含第三方库的子目录未编译

C++ CMake/CLion初学者';s问题:包含第三方库的子目录未编译,c++,cmake,external-library,C++,Cmake,External Library,因此,我现在尝试开始使用cmake一段时间。我想使用来自的rpclib。因此,我用main.cpp和CMakeLists.txt启动了一个新项目,并将rpclib作为子目录复制到我的项目中: 我的代码正是来自rpclib的示例,如下所示: #include <iostream> #include "rpc/server.h" void foo() { std::cout << "foo was called!" <&

因此,我现在尝试开始使用cmake一段时间。我想使用来自的rpclib。因此,我用
main.cpp
CMakeLists.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;
}
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_子目录(rpclib)
负责添加rpclib,并在构建
RPC_测试
-项目期间构建其内容。看来,我错了。rpclib中的任何内容都无法获取生成,并且生成过程RPC_测试失败,并出现链接器错误:

/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, std::__1::char_traits<char>, std::__1::allocator<char> > const&, 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, std::__1::char_traits<char>, std::__1::allocator<char> > const&, 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::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      void rpc::detail::dispatcher::bind<void (*)()>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, void (*)()) in main.cpp.o
      void rpc::detail::dispatcher::bind<void (*)()>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, void (*)(), rpc::detail::tags::void_result const&, rpc::detail::tags::zero_arg const&) in main.cpp.o
      void rpc::detail::dispatcher::bind<main::$_0>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, main::$_0) in main.cpp.o
      void rpc::detail::dispatcher::bind<main::$_0>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, main::$_0, rpc::detail::tags::nonvoid_result const&, 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
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake--build/Users/seba/CLionProjects/rpc cpp/cmake build debug system--target rpc_Test--j 3
扫描目标RPC_测试的依赖项
[50%]构建CXX对象CMakeFiles/RPC_Test.dir/main.cpp.o
[100%]链接CXX可执行RPC_测试
架构x86_64的未定义符号:
“rpc::detail::dispatcher::enforce_arg_count(std::_1::basic_string const&,unsigned long,unsigned long)”,引用自:
void rpc::detail::dispatcher::bind(std::uu 1::basic_string const&,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&)main.cpp.o中的const
void rpc::detail::dispatcher::bind(std:uu 1::basic_string const&,main:$0,rpc::detail::tags::nonoid_result const&,rpc::detail::tags::nonzero_arg const&)::'lambda'(clmdep_msgpack::v2::object const&)::operator()(clmdep_msgpack::v2::object const&)main.cpp.o中的const
“rpc::detail::dispatcher::enforce_unique_name(std::_1::basic_string const&)”,引用自:
main.cpp.o中的void rpc::detail::dispatcher::bind(std::u 1::basic_string const&,void(*)()
main.cpp.o中的void rpc::detail::dispatcher::bind(std:_1::basic_字符串常量&,void(*)(),rpc::detail::tags::void_结果常量&,rpc::detail::tags::zero_arg const&)
main.cpp.o中的void rpc::detail::dispatcher::bind(std:_1::basic_string const&,main:$_0)
main.cpp.o中的void rpc::detail::dispatcher::bind(std:_1::basic_string const&,main:$_0,rpc::detail::tags::nonoid_result const&,rpc::detail::tags::nonzero_arg const&)
“rpc::server::run()”,引用自:
_main in main.cpp.o
“rpc::server::server(未签名短)”引用自:
_main in main.cpp.o
“rpc::server::~server()”,引用自:
_main in main.cpp.o
ld:找不到架构x86_64的符号
叮当声:错误:链接器命令失败,退出代码为1(使用-v查看调用)
生成[3]:***[RPC_测试]错误1
生成[2]:***[CMakeFiles/RPC_Test.dir/all]错误2
生成[1]:***[CMakeFiles/RPC_Test.dir/rule]错误2
make:**[RPC_测试]错误2

缺少什么?

在定义了
RPC\u测试
目标之后,您缺少了一个
target\u链接库(RPC\u Test PRIVATE RPC)
rpc
这里是在
rpclib
CMakeLists.txt
中定义的库目标的名称,而不仅仅是结果二进制工件的基本名称


将目标名称与
target\u link\u库
一起使用时,CMake不仅会将
-lrpc
添加到链接器调用中,还会自动添加使用库所需的include目录,并确保在
rpc\u测试
之前构建
rpc
库。特别是,这意味着您在使用
目标链接库(RPC\u Test PRIVATE RPC)
时,也可以删除
包含目录调用。您需要首先构建lib,然后(取决于您的项目)将libs输出复制到项目中的某个位置,并告诉cmake与创建的libs进行链接。因此,第一步是克隆存储库并在您的计算机上构建它。你能做到这一点吗?