我有一个c ++核心库A,并将其放入.a静态存档中。我正在尝试将此存档链接到另一个快速项目B,该项目使用C绑定到库A。在我向c ++核心库添加一些libc ++ chrono引用之前,一切工作正常。关于A本身可以很好地编译,但是当我链接到项目B时,不再存在用于chrono的符号。
我尝试将chrono放在头文件和cpp文件中。修改了Xcode构建设置,以始终使用libc ++并始终获得相同的结果:
Undefined symbols for architecture x86_64:
"std::__1::chrono::steady_clock::now()", referenced from:
utility::stopwatch::reset() in libtest.a(test.o)
ld: symbol(s) not found for architecture x86_64
我可以在项目A和B中直接使用chrono,但不能将其添加到A并从B中使用它。怎么来的?我有点茫然。
/更新:
使用Xcode 10
复制步骤:
1)创建一个新的工作区A
2)创建一个新的静态库c ++项目B,并将其添加到工作区A中并添加两个文件:
// test.h
extern "C" {
void using_chrono();
}
// test.cpp
#include <chrono>
void using_chrono() {
std::chrono::steady_clock::time_point t = std::chrono::steady_clock::now();
}
3)创建第二个快捷项目C,并将其也添加到工作区A中。
4)创建具有以下内容的桥接头Bridging-Header.h:
// Bridging-Header.h
void using_chrono();
5)构建B
6)在构建阶段将生成的.a归档文件链接到项目C
7)在项目C的构建设置中将桥接头添加到object-c桥接头选项
8)编译。项目C找不到std::chrono::steady_clock::now()
我认为它可能与swift的C转换有关,因为steady_clock::now()
函数仍在使用C ++符号修饰,并且swift需要纯C函数导入。我曾尝试通过全局类,外部“ C”,C包装程序来包装steady_clock::now()
,但是它似乎无法编译(由于chrono模板,在C中包装根本不起作用)。持续时间和time_point等人似乎可以正常工作,但now()
则不能。