将静态存档与libc ++ chrono和Xcode 10

时间:2018-10-09 10:15:37

标签: c++ xcode static-libraries linker-errors

我有一个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()则不能。

0 个答案:

没有答案