Связывание модулей C++ TS с использованием clang

Я пытаюсь использовать модули 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 ствол и Clang 6. Также я пробовал разные std параметры и эта команда:

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

И ничего не помогает.

Интересно, что если один модуль использует символы из другого, clang компилирует эти модули. Итак, насколько я понимаю, проблема в стадии связывания.

В чем может быть проблема?

2 ответа

Решение

Например, https://blogs.msdn.microsoft.com/vcblog/2015/12/03/c-modules-in-vs-2015-update-1/ говорит, что.cppm (.ixx) переводится в.pcm (.ifc) и.o (.obj).

Но в отличие от cl.exe, который автоматически создает эти два файла, файл.o Clang должен быть скомпилирован из файла.pcm:

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

С foo.cppm а также bar.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

В производящем модуле (foo.cppm) вам нужно опустить ключевое слово export из определения модуля.

// foo.cppm
module foo;

export void test() {
}

Все остальное должно работать нормально.

Другие вопросы по тегам