Связывание модулей 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()'

Я попробовал это с лязг 7 ствола и лязг 6.
Также я пробовал разные std параметры и эта команда:

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

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

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

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

0

Решение

Как что 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
1

Другие решения

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

// foo.cppm
module foo;

export void test() {
}

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

0