Link C++20 模块中的静态库错误
Link error with static library in C++20 module
我正在学习 C++20 模块功能,但每当我尝试在模块中包含头文件然后尝试 link 它时,我都会收到 link 错误。我在使用 GLFW 库时遇到错误,但我做了一个最小的可重现示例,这样你就可以更轻松地帮助我。
重现此问题的步骤如下:
- 获取带有函数定义的
.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
- 现在您有了
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
- 写一个
main.cpp
文件并尝试编译和link它:
clang++ -std=c++20 -fmodules-ts -fprebuilt-module-path=. -o main main.cpp test.cpp -l:lib.a -L.
- 你应该得到这个错误:
/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)
我该如何解决这个问题?当我 #include "lib.h"
并在 main.cpp
中调用 libraryFunction()
时,我没有收到错误,但我想要的是从模块调用库 API。这可能吗?
您将 #include
放在模块下方,这可能将 libraryFunction
声明为模块函数。这是有道理的,因为链接器寻找类似 test-libraryFunction
.
的东西
MS sources on modules(将 MS 用作可靠来源的时间真是太长了)说您可以包含“全局”headers,但应该在第一次 module
声明之前完成。
尝试调换顺序:
// test.cpp
#include "lib.h"
export module test;
export void testFunction() {
libraryFunction();
}
应该有帮助。
我正在学习 C++20 模块功能,但每当我尝试在模块中包含头文件然后尝试 link 它时,我都会收到 link 错误。我在使用 GLFW 库时遇到错误,但我做了一个最小的可重现示例,这样你就可以更轻松地帮助我。
重现此问题的步骤如下:
- 获取带有函数定义的
.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
- 现在您有了
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
- 写一个
main.cpp
文件并尝试编译和link它:
clang++ -std=c++20 -fmodules-ts -fprebuilt-module-path=. -o main main.cpp test.cpp -l:lib.a -L.
- 你应该得到这个错误:
/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)
我该如何解决这个问题?当我 #include "lib.h"
并在 main.cpp
中调用 libraryFunction()
时,我没有收到错误,但我想要的是从模块调用库 API。这可能吗?
您将 #include
放在模块下方,这可能将 libraryFunction
声明为模块函数。这是有道理的,因为链接器寻找类似 test-libraryFunction
.
MS sources on modules(将 MS 用作可靠来源的时间真是太长了)说您可以包含“全局”headers,但应该在第一次 module
声明之前完成。
尝试调换顺序:
// test.cpp
#include "lib.h"
export module test;
export void testFunction() {
libraryFunction();
}
应该有帮助。