【发布时间】:2021-09-04 05:12:27
【问题描述】:
我第一次尝试在 Visual Studio Code(不是 Visual Studio)中使用库。我在使用tasks.json 和c_cpp_properties.json 文件链接SFML library 时遇到问题。它们包含用于构建我的 .cpp 和 .hpp 文件的库和编译器标志的包含路径。我的研究表明错误可能是由于链接器造成的,并且可能需要 -l 编译器标志。我发现很少有资源详细说明该标志的实际作用以及在构建我的项目时应该如何实现它。
我的项目文件夹结构如下:
Test_Project (Root Folder)
﹂ build (main.exe compile location)
﹂ include (personal .hpp files)
﹂ src (main.cpp)
﹂ lib (only has SFML library)
﹂ SFML-2.5.1
﹂ bin (has a bunch of .dll files)
﹂ include (folder)
﹂ SFML (has library specific .hpp files)
﹂ lib (has a bunch of .lib files)
我的tasks.json 文件如下。我已经评论了可能有用的部分。 ${workspaceFolder} 指的是根文件夹,也就是 Test_Project。
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file",
"command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe",
"args": [
"-std=c++17", //specify c++17
"-g", //give debug info
"-I${workspaceFolder}/include", //include personal .hpp files
"-I${workspaceFolder}/lib/SFML-2.5.1/include", //include library .hpp files
"-L${workspaceFolder}/lib/SFML-2.5.1/lib", //add .lib files from library
"${workspaceFolder}/src/*.cpp", //builds with all .cpp files
"-o", //-l flag should go before here???
"${workspaceFolder}/build/main.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: \"C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe\""
}
]
}
我的c_cpp_properties.json 在下面。我真的不明白为什么我需要在此处和 tasks.json 中指定包含路径,但我阅读了 this Stack Overflow 帖子,该帖子也将库中的包含放置在包含路径中。
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/lib/SFML-2.5.1/include" // <---
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\gcc.exe",
"cStandard": "gnu17",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}
我尝试使用不同的编译器版本 (MinGW 7.3.0) 进行构建,因为 SFML 推荐它,但仍然出现错误。我的错误如下。
C:/.../Test_Project/src/main.cpp:15: undefined reference to `__imp__ZNK2sf6Window6isOpenEv'
C:/.../Test_Project/src/main.cpp:18: undefined reference to `__imp__ZN2sf6Window9pollEventERNS_5EventE'
C:/.../Test_Project/src/main.cpp:22: undefined reference to `__imp__ZN2sf6Window5closeEv'
C:/.../Test_Project/src/main.cpp:26: undefined reference to `__imp__ZN2sf5ColorC1Ehhhh'
etc...
我正在运行的测试代码是一个简单的 hello world 脚本,应该显示一个红色圆圈。
#include <SFML/Graphics.hpp>
int main() {
auto dimension = sf::VideoMode(1280u, 720u);
auto title = "hello world";
sf::RenderWindow window;
window.create(dimension, title);
sf::CircleShape circle;
circle.setRadius(100);
circle.setPosition(200, 200);
circle.setFillColor(sf::Color::Red);
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
}
window.clear();
window.draw(circle);
window.display();
}
}
我知道 Visual Studio 可以轻松添加这些链接器依赖项,但我所遵循的教程并没有真正描述它们的工作原理,而且我更喜欢 VSCode。对 VSCode 的任何进一步阅读都会很棒,因为 VSCode 上的 C++ 主页并没有真正描述库实现。任何有关如何进行的信息也会很棒。谢谢! :)
【问题讨论】:
-
你为什么不使用 Cmake 或 make ?
-
对于多个 C++ 文件,您需要像 Aditya 建议的构建工具
-
-L不添加 lib 文件。它添加了一个搜索路径。没有要搜索的东西,搜索路径是无用的, -
@AdityaSinghRathore 还没学会。我想知道没有它是否可以编译。
-
@KBazan 如果你打算使用 cpp,你必须使用 make 系统。开始here。如果你想探索 VScode,你应该试试你在做什么。但是如果目标是学习如何在 cpp 中管理多个文件,你可以使用 make 或 cmake
标签: c++ visual-studio-code linker sfml libraries