在 CLion 中使用 CMake 使用参数编译 C++ 会抛出错误,而在终端中编译则不会
Compiling C++ with parameters using CMake in CLion throws errors while compiling in terminal does not
我有一个使用 SFML 库的简单代码,它需要用
编译
-lsfml-graphics -lsfml-system -lsfml-window
个参数。
当我简单地使用 cmd 时它工作得很好
g++ gejm.cpp -o gejm -lsfml-graphics -lsfml-system -lsfml-window
.\gejm.exe
然而,当我 运行 它使用 CLion 时,我收到错误消息,就好像我的参数没有被传递一样。但我知道我的参数已通过,因为如果我拼错其中任何一个,甚至在我的代码被编译之前就会抛出错误。
我的CMakeLists.txt看起来像这样
set(GCC_COVERAGE_COMPILE_FLAGS "-lsfml-graphics -lsfml-system -lsfml-window")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
add_executable(gejm gejm.cpp)
那么问题是什么?
...这是错误
CMakeFiles\gejm.dir/objects.a(gejm.obj): In function `main':
D:/Projects/CPP/GUI/gejm.cpp:8: undefined reference to `_imp___ZN2sf6StringC1EPKcRKSt6locale'
D:/Projects/CPP/GUI/gejm.cpp:8: undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj'
D:/Projects/CPP/GUI/gejm.cpp:8: undefined reference to `_imp___ZN2sf12RenderWindowC1ENS_9VideoModeERKNS_6StringEjRKNS_15ContextSettingsE'
D:/Projects/CPP/GUI/gejm.cpp:9: undefined reference to `_imp___ZNK2sf10WindowBase6isOpenEv'
D:/Projects/CPP/GUI/gejm.cpp:11: undefined reference to `_imp___ZN2sf10WindowBase9pollEventERNS_5EventE'
D:/Projects/CPP/GUI/gejm.cpp:13: undefined reference to `_imp___ZN2sf6Window5closeEv'
D:/Projects/CPP/GUI/gejm.cpp:17: undefined reference to `_imp___ZN2sf5ColorC1Ehhhh'
D:/Projects/CPP/GUI/gejm.cpp:17: undefined reference to `_imp___ZN2sf12RenderTarget5clearERKNS_5ColorE'
D:/Projects/CPP/GUI/gejm.cpp:18: undefined reference to `_imp___ZN2sf6Window7displayEv'
D:/Projects/CPP/GUI/gejm.cpp:8: undefined reference to `_imp___ZN2sf12RenderWindowD1Ev'
D:/Projects/CPP/GUI/gejm.cpp:8: undefined reference to `_imp___ZN2sf12RenderWindowD1Ev'
collect2.exe: error: ld returned 1 exit status
CMakeFiles\gejm.dir\build.make:84: recipe for target 'gejm.exe' failed
CMakeFiles\Makefile2:71: recipe for target 'CMakeFiles/gejm.dir/all' failed
mingw32-make.exe[3]: *** [gejm.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/gejm.dir/all] Error 2
CMakeFiles\Makefile2:83: recipe for target 'CMakeFiles/gejm.dir/rule' failed
mingw32-make.exe[1]: *** [CMakeFiles/gejm.dir/rule] Error 2
mingw32-make.exe: *** [gejm] Error 2
Makefile:117: recipe for target 'gejm' failed
这不是添加库的方法:
set(GCC_COVERAGE_COMPILE_FLAGS "-lsfml-graphics -lsfml-system -lsfml-window")
将这些库添加到库列表中:
target_link_libraries(gejm PUBLIC sfml-graphics sfml-system sfml-window)
它不起作用的原因是 link 阶段不是编译阶段,您只覆盖了编译标志,而不是 link 标志。无论如何,这不是正确的方法。使用 CMake 提供的东西,不要破解任何东西。
我有一个使用 SFML 库的简单代码,它需要用
编译-lsfml-graphics -lsfml-system -lsfml-window
个参数。
当我简单地使用 cmd 时它工作得很好
g++ gejm.cpp -o gejm -lsfml-graphics -lsfml-system -lsfml-window
.\gejm.exe
然而,当我 运行 它使用 CLion 时,我收到错误消息,就好像我的参数没有被传递一样。但我知道我的参数已通过,因为如果我拼错其中任何一个,甚至在我的代码被编译之前就会抛出错误。
我的CMakeLists.txt看起来像这样
set(GCC_COVERAGE_COMPILE_FLAGS "-lsfml-graphics -lsfml-system -lsfml-window")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
add_executable(gejm gejm.cpp)
那么问题是什么?
...这是错误
CMakeFiles\gejm.dir/objects.a(gejm.obj): In function `main':
D:/Projects/CPP/GUI/gejm.cpp:8: undefined reference to `_imp___ZN2sf6StringC1EPKcRKSt6locale'
D:/Projects/CPP/GUI/gejm.cpp:8: undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj'
D:/Projects/CPP/GUI/gejm.cpp:8: undefined reference to `_imp___ZN2sf12RenderWindowC1ENS_9VideoModeERKNS_6StringEjRKNS_15ContextSettingsE'
D:/Projects/CPP/GUI/gejm.cpp:9: undefined reference to `_imp___ZNK2sf10WindowBase6isOpenEv'
D:/Projects/CPP/GUI/gejm.cpp:11: undefined reference to `_imp___ZN2sf10WindowBase9pollEventERNS_5EventE'
D:/Projects/CPP/GUI/gejm.cpp:13: undefined reference to `_imp___ZN2sf6Window5closeEv'
D:/Projects/CPP/GUI/gejm.cpp:17: undefined reference to `_imp___ZN2sf5ColorC1Ehhhh'
D:/Projects/CPP/GUI/gejm.cpp:17: undefined reference to `_imp___ZN2sf12RenderTarget5clearERKNS_5ColorE'
D:/Projects/CPP/GUI/gejm.cpp:18: undefined reference to `_imp___ZN2sf6Window7displayEv'
D:/Projects/CPP/GUI/gejm.cpp:8: undefined reference to `_imp___ZN2sf12RenderWindowD1Ev'
D:/Projects/CPP/GUI/gejm.cpp:8: undefined reference to `_imp___ZN2sf12RenderWindowD1Ev'
collect2.exe: error: ld returned 1 exit status
CMakeFiles\gejm.dir\build.make:84: recipe for target 'gejm.exe' failed
CMakeFiles\Makefile2:71: recipe for target 'CMakeFiles/gejm.dir/all' failed
mingw32-make.exe[3]: *** [gejm.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/gejm.dir/all] Error 2
CMakeFiles\Makefile2:83: recipe for target 'CMakeFiles/gejm.dir/rule' failed
mingw32-make.exe[1]: *** [CMakeFiles/gejm.dir/rule] Error 2
mingw32-make.exe: *** [gejm] Error 2
Makefile:117: recipe for target 'gejm' failed
这不是添加库的方法:
set(GCC_COVERAGE_COMPILE_FLAGS "-lsfml-graphics -lsfml-system -lsfml-window")
将这些库添加到库列表中:
target_link_libraries(gejm PUBLIC sfml-graphics sfml-system sfml-window)
它不起作用的原因是 link 阶段不是编译阶段,您只覆盖了编译标志,而不是 link 标志。无论如何,这不是正确的方法。使用 CMake 提供的东西,不要破解任何东西。