【问题标题】:Linking C++ modules TS using clang使用 clang 链接 C++ 模块 TS
【发布时间】:2018-02-03 11:23:09
【问题描述】:

我正在尝试将 C++ 模块 TS 与 clang 一起使用。

我创建了两个文件:

// foo.cppm
export module foo;

export void test() {
}

// bar.cpp
import foo;

int main() {
  test();
  return 0;
}

我用这个命令编译foo.cppm

clang++ --std=c++17 -fmodules-ts --precompile foo.cppm -o foo.pcm

它编译没有错误并创建一个foo.pcm 文件,但是当我尝试使用此命令编译二进制文件时:

clang++ --std=c++17 -fmodules-ts -fprebuilt-module-path=. -fmodule-file=foo.pcm bar.cpp

它打印一个错误:

/tmp/bar-f69a1f.o: In function `main':
bar.cpp:(.text+0x10): undefined reference to `test()'

我用 clang 7 trunk 和 clang 6 试过了。 我也尝试了不同的std 选项和这个命令:

clang++ --std=c++17 -fmodules-ts -fmodule-file=foo.pcm bar.cpp -o bar

没有任何帮助。

有趣的是,如果一个模块使用来自其他模块的符号,clang 会编译这些模块。据我了解,问题出在链接阶段。

可能是什么问题?

【问题讨论】:

    标签: c++ clang c++-modules


    【解决方案1】:

    就像https://blogs.msdn.microsoft.com/vcblog/2015/12/03/c-modules-in-vs-2015-update-1/ 所说的那样,.cppm (.ixx) 转换为 .pcm (.ifc) .o (.obj)。

    但与自动生成这两个文件的 cl.exe 不同,Clang 的 .o 文件必须从其 .pcm 文件编译:

    clang++ --std=c++17 -fmodules-ts -c foo.pcm -o foo.o
    

    使用上面的foo.cppmbar.cpp,命令如下:

    clang++ --std=c++17 -fmodules-ts --precompile foo.cppm -o foo.pcm
    clang++ --std=c++17 -fmodules-ts -c foo.pcm -o foo.o
    clang++ --std=c++17 -fmodules-ts -fprebuilt-module-path=. foo.o bar.cpp
    

    【讨论】:

    • 我用 clang++ 7.0.0 trunk x64-pc-linux-gnu 对其进行了测试并报告它可以工作,谢谢!
    【解决方案2】:

    在生成模块 (foo.cppm) 中,您需要从模块定义中省略关键字 export

    // foo.cppm
    module foo;
    
    export void test() {
    }
    

    其他一切都应该可以正常工作。

    【讨论】:

    • clang 打印 error: missing 'export' specifier in module declaration while building module interface
    • 很有趣 - 您使用的是哪个 clang 和哪个操作系统?我的 clang 不支持命令行选项 --std=c++17 但其他一切都运行良好(Mac OS)
    • 我正在尝试在 Debian Linux 9.3 上使用 clang 6.0 和 clang 7.0 进行编译
    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 2018-03-13
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多