Связывание модулей 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() {
}
Все остальное должно работать нормально.