cmake troubleshoot

Cmake 工程测试不通过

错误信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Performing C SOURCE FILE Test CMAKE_HAVE_LIBC_PTHREAD failed with the following output:
Change Dir: /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-ZS4h4J

Run Build Command(s):/usr/bin/gmake -f Makefile cmTC_48078/fast && /usr/bin/gmake -f CMakeFiles/cmTC_48078.dir/build.make CMakeFiles/cmTC_48078.dir/build
gmake[1]: Entering directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-ZS4h4J'
Building C object CMakeFiles/cmTC_48078.dir/src.c.o
/opt/scylladb/bin/gcc -DCMAKE_HAVE_LIBC_PTHREAD -fdiagnostics-color=always -o CMakeFiles/cmTC_48078.dir/src.c.o -c /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-ZS4h4J/src.c
Linking C executable cmTC_48078
/data/zhenkai.sun/app/cmake-3.25.1-linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/cmTC_48078.dir/link.txt --verbose=1
/opt/scylladb/bin/gcc CMakeFiles/cmTC_48078.dir/src.c.o -o cmTC_48078
CMakeFiles/cmTC_48078.dir/src.c.o: In function `main':
src.c:(.text+0x2d): undefined reference to `pthread_create'
src.c:(.text+0x39): undefined reference to `pthread_detach'
src.c:(.text+0x45): undefined reference to `pthread_cancel'
src.c:(.text+0x56): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status
gmake[1]: *** [cmTC_48078] Error 1
gmake[1]: Leaving directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-ZS4h4J'
gmake: *** [cmTC_48078/fast] Error 2


Source file was:
#include <pthread.h>

static void* test_func(void* data)
{
return data;
}

int main(void)
{
pthread_t thread;
pthread_create(&thread, NULL, test_func, NULL);
pthread_detach(thread);
pthread_cancel(thread);
pthread_join(thread, NULL);
pthread_atfork(NULL, NULL, NULL);
pthread_exit(NULL);

return 0;
}

Performing C++ SOURCE FILE Test StdAtomic_EXPLICIT_LINK failed with the following output:
Change Dir: /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-pPTD7R

Run Build Command(s):/usr/bin/gmake -f Makefile cmTC_f3ae9/fast && /usr/bin/gmake -f CMakeFiles/cmTC_f3ae9.dir/build.make CMakeFiles/cmTC_f3ae9.dir/build
gmake[1]: Entering directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-pPTD7R'
Building CXX object CMakeFiles/cmTC_f3ae9.dir/src.cxx.o
/opt/scylladb/bin/g++ -DStdAtomic_EXPLICIT_LINK -w -g -pthread -fno-omit-frame-pointer -Werror=return-type -fsanitize=address -fdiagnostics-color=always -std=gnu++1z -o CMakeFiles/cmTC_f3ae9.dir/src.cxx.o -c /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-pPTD7R/src.cxx
Linking CXX executable cmTC_f3ae9
/data/zhenkai.sun/app/cmake-3.25.1-linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/cmTC_f3ae9.dir/link.txt --verbose=1
/opt/scylladb/bin/g++ -w -g -pthread -fno-omit-frame-pointer -Werror=return-type -fsanitize=address CMakeFiles/cmTC_f3ae9.dir/src.cxx.o -o cmTC_f3ae9 -latomic
/usr/bin/ld: cannot find /opt/scylladb/lib64/libatomic.so.1.2.0
collect2: error: ld returned 1 exit status
gmake[1]: *** [cmTC_f3ae9] Error 1
gmake[1]: Leaving directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-pPTD7R'
gmake: *** [cmTC_f3ae9/fast] Error 2


Source file was:
int main() {}

Performing C++ SOURCE FILE Test StdFilesystem_NO_EXPLICIT_LINK failed with the following output:
Change Dir: /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-DLboHE

Run Build Command(s):/usr/bin/gmake -f Makefile cmTC_29ea1/fast && /usr/bin/gmake -f CMakeFiles/cmTC_29ea1.dir/build.make CMakeFiles/cmTC_29ea1.dir/build
gmake[1]: Entering directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-DLboHE'
Building CXX object CMakeFiles/cmTC_29ea1.dir/src.cxx.o
/opt/scylladb/bin/g++ -DStdFilesystem_NO_EXPLICIT_LINK -w -g -pthread -fno-omit-frame-pointer -Werror=return-type -std=c++17 -fdiagnostics-color=always -std=gnu++1z -o CMakeFiles/cmTC_29ea1.dir/src.cxx.o -c /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-DLboHE/src.cxx
Linking CXX executable cmTC_29ea1
/data/zhenkai.sun/app/cmake-3.25.1-linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/cmTC_29ea1.dir/link.txt --verbose=1
/opt/scylladb/bin/g++ -w -g -pthread -fno-omit-frame-pointer -Werror=return-type -std=c++17 CMakeFiles/cmTC_29ea1.dir/src.cxx.o -o cmTC_29ea1
CMakeFiles/cmTC_29ea1.dir/src.cxx.o: In function `std::experimental::filesystem::v1::path::path<char [6], std::experimental::filesystem::v1::path>(char const (&) [6])':
/opt/scylladb/include/c++/7/experimental/bits/fs_path.h:198: undefined reference to `std::experimental::filesystem::v1::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status
gmake[1]: *** [cmTC_29ea1] Error 1
gmake[1]: Leaving directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-DLboHE'
gmake: *** [cmTC_29ea1/fast] Error 2

解决方案

ninja-build 版本低

升级 ninja-build 版本,从 1.7.2 升级到 1.11.1 后问题解决。最新版,从这里下载。

使用其他 GCC 库

比如,使用 /opt/scylladb/bin 下的 gcc,需要同步设置 LD_LIBRARY_PATH 和 LIBRARY_PATH。

1
2
3
PATH=/opt/scylladb/bin:$PATH
LD_LIBRARY_PATH=/opt/scylladb/lib64:/opt/scylladb/lib:$LD_LIBRARY_PATH
LIBRARY_PATH=/opt/scylladb/lib64:/opt/scylladb/lib:$LIBRARY_PATH

以免出现以下错误。

1
libstdc++.so.6: version `GLIBCXX_3.4.20' not found

这是因为使用的 g++ 版本和最终链接的 libstdc++ 库不一致导致的。

CMake Error: install(EXPORT “tgt” …) includes target “tgt” which requires target “dep_internal” that is not in any export set

1
2
3
4
add_library(tgt ...)
target_link_libraries(tgt PRIVATE dep_internal)
install(TARGETS tgt EXPORT tgt ...)
install(EXPORT tgt ...)

报错

1
CMake Error: install(EXPORT "tgt" ...) includes target "tgt" which requires target "dep_internal" that is not in any export set

原因

dep_internal 是工程内依赖,且不想安装和 export。在安装和导出 tgt 时,由于依赖项目内定义的库 dep_internal,且是 PRIVATE link,又没有 export,因此出现冲突。

解决

使用 $<BUILD_INTERFACE:{target}>,仅在编译时引用 target。

1
target_link_libraries(tgt PRIVATE $<BUILD_INTERFACE:dep_internal>)

如果被其他库依赖。

1
2
3
4
add_library(tgt ...)
target_link_libraries(tgt PRIVATE dep_internal)
install(TARGETS tgt dep_internal EXPORT tgt ...)
install(EXPORT tgt ...)

Some (but not all) targets in this export set were already defined.

1
2
3
4
5
6
7
8
CMake Error at cmake-build-debug/vcpkg_installed/x64-linux/share/tcmalloc_minimal_static/tcmalloc_minimal_staticConfig.cmake:42 (message):
Some (but not all) targets in this export set were already defined.

Targets Defined: gperftools::spinlock, gperftools::sysinfo,
gperftools::logging

Targets not yet defined: gperftools::tcmalloc_minimal_static,
gperftools::tcmalloc_minimal_internal

一个项目内有多个目标 TargetA 、TargetB。两个目标共同依赖 InternalLibA。

1
2
3
4
5
install(TARGETS TargetA InternalLibA EXPORT TargetA ...)
install(EXPORT TargetA ... NAMESPACE Project)

install(TARGETS TargetB InternalLibA EXPORT TargetB ...)
install(EXPORT TargetB ... NAMESPACE Project)

如上述导入后,如果在其他项目引入。

1
2
3
4
5
find_package(TargetA CONFIG REQUIRED)
target_link_libraries(main PRIVATE Project::TargetA)

find_package(TargetB CONFIG REQUIRED)
target_link_libraries(main PRIVATE Project::TargetB)

则会报如下的错。

1
2
3
4
5
Some (but not all) targets in this export set were already defined.

Targets Defined: Project::InternalLibA

Targets not yet defined: Project::TargetB

原因是在 find_package TargetB 时,出现重复的目标,Project::InternalLibA,在 find_package TargetA 时第一次定义。出现命名冲突。

解决办法,修改 install EXPORT 的 NAMESPACE,避免命名冲突。

1
2
3
4
5
install(TARGETS TargetA InternalLibA EXPORT TargetA ...)
install(EXPORT TargetA ... NAMESPACE TargetA)

install(TARGETS TargetB InternalLibA EXPORT TargetB ...)
install(EXPORT TargetB ... NAMESPACE TargetA)

使用。

1
2
3
4
5
find_package(TargetA CONFIG REQUIRED)
target_link_libraries(main PRIVATE TargetA::TargetA)

find_package(TargetB CONFIG REQUIRED)
target_link_libraries(main PRIVATE TargetB::TargetB)

possibly undefined macro: AC_PROG_LIBTOOL

1
2
3
configure.ac:94: error: possibly undefined macro: AC_PROG_LIBTOOL
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
1
2
# 安装 libtool
$ yum install libtool

vs code 使用

快捷键

多行编辑

1
2
3
4
5
6
# 选取多行
Option+Shift+{鼠标移动多行}
# 选中文本
选取多行 + Shift + {移动指针}
# 选中文本, 按词移动
选取多行 + Shift + Option + {方向键}

其他

搜索框输入换行

Ctrl + Enter 输入换行

推荐系统 - 模型

推荐系统中的模型

双塔模型

双塔模型(Dual Tower Model)是一种在自然语言处理中用于生成式任务的模型架构。该模型的核心思想是将输入序列分别传递给两个独立的编码器,称为「内容塔」(Content Tower)和「控制塔」(Control Tower),以实现更好的生成效果。

具体来说,双塔模型包含以下几个关键组件:

  1. 内容塔(Content Tower):内容塔负责捕捉输入序列的语义信息和表示。它通常基于预训练的语言模型(如BERT、GPT等)或其他编码器来对输入进行编码,并输出一个表示输入内容的向量序列。
  2. 控制塔(Control Tower):控制塔负责生成输出序列,并指导生成过程。它可以从内容塔的输出中获取输入的语义信息,并根据任务要求生成合适的输出。控制塔可以采用不同的机制,如循环神经网络(RNN)、注意力机制(Attention)等,来实现生成过程。
  3. 连接层(Connector Layer):连接层用于将内容塔的输出和控制塔的输入进行连接,以建立二者之间的联系。可以通过简单的拼接、加权相加等方式实现连接。
  4. 解码器(Decoder):解码器是控制塔的核心组件,用于根据控制塔的输入和先前生成的内容来生成下一个输出。解码器可以基于不同的方法进行设计和训练,以满足特定任务的要求。

使用双塔模型的主要优势在于将表示学习和生成过程分离,充分利用内容塔和控制塔各自的优势。内容塔能够捕捉输入序列的语义信息,而控制塔能够利用这些信息进行更加准确和鲁棒的生成。通过有效地协同工作,双塔模型可以取得较好的生成结果。

需要指出的是,双塔模型的具体实现方式可能因任务需求和研究者的选择而有所差异。该模型的结构和组件可以根据具体情况进行调整和扩展,以适应不同的生成式任务。

适用阶段

  1. 召回
  2. 排序(通常是粗排)

Socket 编程

Basic

img

Code

epoll

methods

1
2
3
epoll_create(...)  // 创建 epoll
epoll_ctl(...) // 向 epoll 注册 socketfd
epoll_wait(...) // 从 epoll 获取事件

steps

  • socket()
  • bind()
  • listen()
  • epoll
    • epoll_create()
    • epoll_ctl() : Add server socket to epoll instance
    • epoll_wait()
  • accept()
  • epoll_ctl() : Add client socket to epoll instance
  • read()
  • write()

Reference

IO 模型

IO 模型分类

常见的 IO 模型分为以下五类。

  • 同步阻塞 IO(BIO)
  • 同步非阻塞 IO(NIO)
  • IO 多路复用
  • 信号驱动IO
  • 异步非阻塞 IO(AIO)

客户端连接模式

从客户端角度,可以分为短连接、连接池、单连接,后两者属于长连接。对于单连接实现起来相对复杂,Server 端通常要实现 IO 多路复用,通常提供异步非阻塞 API,同一链接可以被多个线程使用。连接池的方式实现起来相对简单,通常提供阻塞式 API。

同步、异步、阻塞、非阻塞

参见 这里

PORT 复用

以 seastar 框架为例。首先,监听端口,并设置端口复用。

服务端

监听

1
2
3
4
// int port = 80;
listen_options lo;
lo.reuse_address = true;
listener = engine().listen(make_ipv4_address({port}), lo);

等待

调用框架 accept 方法,等待连接。

1
2
3
4
keep_doing([this] {
return listener->accept().then([this] (seastar::accept_result &&ar) mutable {
handle_connection(std::move(ar));
});

当有新链接创建时,返回 accept_result。

1
2
3
4
5
/// The result of an server_socket::accept() call
struct accept_result {
connected_socket connection; ///< The newly-accepted connection
socket_address remote_address; ///< The address of the peer that connected to us
};

处理

1
2
3
4
5
6
7
8
9
10
handle_connection(seastar::accept_result &&ar) {
do_until(
[ar] { return !ar->connection->is_valid(); },
[this, ar]() mutable { return handle_one_session(ar);
})
}

handle_one_session(seastar::accept_result &ar) {
ar->connection.input().read_exactly(/*size of header*/).read_exactly(/*size of body*/).then(/* processor */);
}

回写数据

1
2
3
4
send(seastar::accept_result &ar, seastar::net::packet &&pack) {
ar->connection.output().write(std::move(pack));
ar->connection.output().flush();
}

客户端

创建连接

1
2
3
4
5
6
engine().net().connect(make_ipv4_address(ipv4_addr{server_addr}))
.then_wrapped([this, server_addr](auto &&f) mutable {
seastar::connected_socket fd = std::move(f.get0());
fd.set_nodelay(true);
fd.set_keepalive(true);
});

发送数据

和 server 端回写数据一致。

1
2
3
4
send(seastar::accept_result &ar, seastar::net::packet &&pack) {
ar->connection.output().write(std::move(pack));
ar->connection.output().flush();
}

读取响应

1
2
3
4
5
6
7
8
9
10
11
12
13
read(seastar::connected_socket &&fd) {
do_until(
[this]{ return !is_running; },
[&]() mutable {
fd->input().read_exactly(/*size of header*/).read_exactly(/*size of body*/).then([] {
/*
1. get request id from response
2. dispatch by request id (notify blocked thread)
*/
})
}
)
}

QA

是否并发处理请求

是的,server 端监听端口,有连接创建时,保存连接,并按顺序读取 header 和 body,读取一个完整请求后,交由 background 线程处理。

如何保证 request 和 response 一一对应

server 端不保证按请求顺序返回相应,由客户端根据响应信息进行路由(比如 request_id 或自增的 request_number)。

BRPC - 自定义

自定义协议

对于绝大多数线上服务,服务间的 RPC 都是通过 TCP/IP 协议,brpc 同样是基于 TCP/IP 协议封装的 RPC 框架,支持自定义协议,来兼容多种服务端的调用。实现了部分常用的协议,也可以自定义适用于特定场景的协议。

这里是 BRPC 添加协议的官方文档

工作效能 - OKR

OKR(Objectives and Key Results)目标与关键成果法,是一套明确和跟踪目标其完成情况的管理工具和方法

编写 OKR

Objective

  • 描述目标时要具体且有方向性
  • 制定目标时要有挑战性
1
2
3
4
5
6
# 要具体且有方向性
× 提高英语水平
√ 半年后,可以用英文做专业领域的分享
# 要有挑战性
× 十年后,可以用英文做专业领域的分享
√ 半年后,可以用英文做专业领域的分享

Key Result

  • KR 要能支持目标实现
  • 定量或定性地描述 KR
1
2
3
# 定量或定性
× 背诵专业词汇
√ 能熟练使用 200 个专业领域的词汇和表达

参考