atualização: a correção é mostrada no código.
Tenho uma função definida em main.cpp
. Quero chamá-la dentro module Hello.
O arquivo Hello.cppm
exporta module Hello
com a implementação em hello.cpp
. Os arquivos são cortados e colados de arquivos maiores, então erros de compilação podem ocorrer. Eles devem estar próximos. (O IDE do Compiler Explorer não faria módulos para mim.)
A questão é, onde posso colocar a declaração extern em hello.cpp
ou talvez (não parece provável) Hello.cppm
? Eu tentei posições antes e depois das várias declarações. A maioria gera erros do compilador. Onde está agora, ele compila, mas não vincula. Eu suspeito que seja considerada uma função module
não exportada .module Hello
Deveria funcionar em um arquivo de cabeçalho, mas pode funcionar sem um arquivo de cabeçalho ? Este é um experimento de aprendizado. Em um cabeçalho, tudo funciona, mas não deveria ser necessário para uma única função.
Usando GCC 14.2 e CMake 2.38.2 no Ubuntu 24.04
O erro do vinculador.
function `main':
main.cpp:(.text.startup+0x1c): undefined reference to `mod::HelloAgain@Hello::operator()() const'
/usr/bin/ld: libHello.a(hello.cpp.o): in function `mod::Hello@Hello::operator()() const':
hello.cpp:(.text+0x1d): undefined reference to `hello_func_global@Hello[abi:cxx11]()'
principal.cpp
#include <iostream>
#include <string>
using namespace std::literals;
auto hello_func_global() -> std::string {
return "Hello from a global function."s;
}
import Hello;
auto main() -> int {
mod::Hello();
constexpr mod::Hello hello;
constexpr mod::HelloAgain hello_again;
hello_again();
std::cout << hello_func() << '\n';
return 0;
}
Olá.cppm
module ;
#include <string>
export module Hello;
export namespace mod {
struct Hello {
auto operator()() const -> void;
};
}
inferno0.cpp
module Hello;
extern auto hello_func_global() -> std::string; // <=== the fix
using namespace std::literals;
namespace mod {
auto Hello::operator()() const -> void {
hello_func_global();
std::cout << "Hello modules" << '\n';
}
}
O arquivo CMake que constrói o módulo.
cmake_minimum_required(VERSION 3.28.3)
project(Hello)
add_library(Hello)
target_sources(Hello
PUBLIC
FILE_SET CXX_MODULES
FILES Hello.cppm
PRIVATE
hello.cpp
hello_again.cpp
)
set_target_properties(Hello PROPERTIES CXX_MODULE_TYPE GLOBAL)
Exatamente.
Você não tem outra escolha a não ser colocá-lo depois de
module Hello;
.Para informar ao compilador que ele não está anexado ao módulo, use uma especificação de ligação
extern "C++"
.