C++ 模块中静态库的链接错误

Link error with static library in C++20 module

提问人:Volper 提问时间:4/26/2021 更新时间:4/26/2021 访问量:1026

问:

我正在学习 C++ 模块功能,但是每当我尝试在模块中包含头文件然后尝试链接它时,我都会收到链接错误。我在使用 GLFW 库时遇到了错误,但我做了一个最小的可重现示例,以便您可以更轻松地帮助我。

以下是重现此问题的步骤:

  1. 获取具有函数定义的文件:.a
// lib.h
void libraryFunction();
// lib.cpp
#include "lib.h"

void libraryFunction() {}
clang++ -c -o lib.o lib.cpp
ar rc lib.a lib.o
  1. 现在你有了文件,编写并编译一个使用它的模块:lib.a
// test.cpp
export module test;
#include "lib.h"

export void testFunction() {
    libraryFunction();
}
clang++ -std=c++20 -c -fmodules-ts -Xclang -emit-module-interface -o test.pcm test.cpp
  1. 编写一个文件并尝试编译和链接它:main.cpp
clang++ -std=c++20 -fmodules-ts -fprebuilt-module-path=. -o main main.cpp test.cpp -l:lib.a -L.
  1. 您应该收到以下错误:
/usr/bin/ld: /tmp/test-25d7c8.o: in function `testFunction()':
test.cpp:(.text+0x5): undefined reference to `_ZW4testE15libraryFunctionv'
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)

如何解决此问题?当我和调用时,我没有收到错误,但我想要的是从模块调用库 API。这可能吗?#include "lib.h"libraryFunction()main.cpp

C++ 器错误 C++20 静态链接

评论

0赞 Ken White 4/26/2021
这回答了你的问题吗?什么是未定义的引用/未解析的外部符号错误,如何解决?

答:

1赞 luk32 4/26/2021 #1

您已经放置了下面的模块,它可能声明为模块函数。这是有道理的,因为链接器会查找类似 .#includelibraryFunctiontest-libraryFunction

模块上的 MS 源(使用 MS 作为可靠源是多么重要)说您可以包含“全局”标头,但这应该在第一次声明之前完成。module

尝试切换顺序:

// test.cpp
#include "lib.h"

export module test;

export void testFunction() {
    libraryFunction();
}

应该有帮助。

评论

1赞 Davis Herring 4/26/2021
首先需要允许这样的 s,尽管 MSVC 可能还没有强制执行,因为它们的实现早于该规则。module;#include
0赞 luk32 4/27/2021
@DavisHerring我用 std2a 在 clang10 上对此进行了测试。如果你能给我指出一个来源,我很乐意纠正。我不会假装我是模块方面的专家,而且资源还非常稀缺。我阅读了模块上的 clang 文档,但没有看到要求,但也许它们也(太)友好。
1赞 Davis Herring 4/27/2021
我只有标准:大部分模块文档都是基于(不同的)预标准化实现的。