Я пытаюсь использовать модули 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 компилирует эти модули. Итак, насколько я понимаю, проблема в стадии связывания.
В чем может быть проблема?
Как что 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() {
}
Все остальное должно работать нормально.