c++ - 未编译具有 3rd 方库的子目录
问题描述
我想从这里使用 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;
}
我的 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, 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
什么不见了?
解决方案
您在targettarget_link_libraries(RPC_Test PRIVATE rpc)
的定义之后缺少 a 。这是在's中定义的库目标的名称,而不仅仅是生成的二进制工件的基本名称。RPC_Test
rpc
rpclib
CMakeLists.txt
当使用具有target_link_libraries
类似 CMake 的目标名称时,不仅会添加-lrpc
到链接器调用中,还会自动添加使用库所需的包含目录,并确保该rpc
库是在RPC_Test
. 特别是,这意味着您还可以include_directories
在使用target_link_libraries(RPC_Test PRIVATE rpc)
.
推荐阅读
- django - 是否可以在 django 中使用两个以上的变量进行身份验证?
- git - Git修改内容未跟踪内容
- mysql - Laravel - 如何优化 MIN - MAX - orderBy 查询?
- php - 作曲家需要gloudemans/shoppingcart?
- flutter - Flutter:使用 Switch 语句时颜色没有改变
- python - 如何使用列表推导加速功能?
- ios - 滚动崩溃后的 UICollection 视图“重新加载数据”
- python - 我们如何更新 Django REST 框架/Django 表单中所需的模型字段
- gradle - JavaFX,如何使用“import java.util.Random;”,“无法解析符号“java”。在 Gradle 下
- python - 尝试使用补丁来模拟 BlobServiceClient 但调用了真正的类