繁体   English   中英

C ++ CMake构建错误“未定义参考”

[英]C++ CMake Build Errors “Undefined Reference”

我对CMake还是很陌生,我正在尝试使用VS2017和WSL(Linux子系统)构建跨平台的c ++项目。 不幸的是,我仍然试图了解CMake如何处理依赖关系和链接,因此我遇到了很多“未解决的外部符号”和“对...的未定义引用”错误。

为了更容易理解,我创建了以下项目,在该项目中我可以复制遇到的错误。 需要一些帮助以更好地了解如何配置CMake。

注意:尽管我在本示例中并未真正使用任何opencv代码,但我只是在其中包括opencv文件夹,以显示我如何尝试使用CMake包括外部依赖项。

项目文件夹结构

/CMakeLists.txt
#include <iostream>
#include <string>
#include <log.hpp>

int main()
{
    log(LEVEL_INFO, "Sample App running...");
    return 0;
}
/src/CMakeLists.txt
18:06:55: Copying files to remote machine...
18:06:55: Finished copying files (elapsed time 00h:00m:00s:009ms).
cd '/var/tmp/build/3df28527-45dd-1335-b3fd-743d2a9ed7dd/build/Linux-Debug';/usr/local/bin/cmake --build "/var/tmp/build/3df28527-45dd-1335-b3fd-743d2a9ed7dd/build/Linux-Debug" --target SampleApp  ;

[ 50%] Linking CXX executable SampleApp
CMakeFiles/SampleApp.dir/main.cpp.o: In function `main':
/var/tmp/src/3df28527-45dd-1335-b3fd-743d2a9ed7dd/Linux-Debug/src/main.cpp:7: undefined reference to `log(LogLevel const&, char const*)'
collect2: error: ld returned 1 exit status
src/CMakeFiles/SampleApp.dir/build.make:94: recipe for target 'src/SampleApp' failed
make[3]: *** [src/SampleApp] Error 1
CMakeFiles/Makefile2:85: recipe for target 'src/CMakeFiles/SampleApp.dir/all' failed
make[2]: *** [src/CMakeFiles/SampleApp.dir/all] Error 2
CMakeFiles/Makefile2:97: recipe for target 'src/CMakeFiles/SampleApp.dir/rule' failed
make[1]: *** [src/CMakeFiles/SampleApp.dir/rule] Error 2
Makefile:118: recipe for target 'SampleApp' failed
make: *** [SampleApp] Error 2

Build failed.
/src/main.cpp
 #include <iostream> #include <string> #include <log.hpp> int main() { log(LEVEL_INFO, "Sample App running..."); return 0; } 
/utils/log.hpp
 #pragma once typedef enum { LEVEL_DEBUG = 0, LEVEL_INFO = 1, LEVEL_WARNING = 2, LEVEL_ERROR = 3, } LogLevel; void log(const LogLevel& level, const char* str); 
/utils/log.cpp
 #include <iostream> #include <log.hpp> std::string getLogStr(const LogLevel& level) { switch (level) { case LEVEL_INFO: return "INFO"; case LEVEL_DEBUG: return "DEBUG"; case LEVEL_ERROR: return "ERROR"; case LEVEL_WARNING: return "WARNING"; default: return "n/a"; } } void log(const LogLevel& level, const char* str) { std::cout << getLogStr(level) << " " << str << std::endl; } 
建立输出日志
 18:06:55: Copying files to remote machine... 18:06:55: Finished copying files (elapsed time 00h:00m:00s:009ms). cd '/var/tmp/build/3df28527-45dd-1335-b3fd-743d2a9ed7dd/build/Linux-Debug';/usr/local/bin/cmake --build "/var/tmp/build/3df28527-45dd-1335-b3fd-743d2a9ed7dd/build/Linux-Debug" --target SampleApp ; [ 50%] Linking CXX executable SampleApp CMakeFiles/SampleApp.dir/main.cpp.o: In function `main': /var/tmp/src/3df28527-45dd-1335-b3fd-743d2a9ed7dd/Linux-Debug/src/main.cpp:7: undefined reference to `log(LogLevel const&, char const*)' collect2: error: ld returned 1 exit status src/CMakeFiles/SampleApp.dir/build.make:94: recipe for target 'src/SampleApp' failed make[3]: *** [src/SampleApp] Error 1 CMakeFiles/Makefile2:85: recipe for target 'src/CMakeFiles/SampleApp.dir/all' failed make[2]: *** [src/CMakeFiles/SampleApp.dir/all] Error 2 CMakeFiles/Makefile2:97: recipe for target 'src/CMakeFiles/SampleApp.dir/rule' failed make[1]: *** [src/CMakeFiles/SampleApp.dir/rule] Error 2 Makefile:118: recipe for target 'SampleApp' failed make: *** [SampleApp] Error 2 Build failed. 

发现了问题...我查找文件的方式错误,并且使用了错误的CMake变量。 在此特定情况下的解决方案下方:

/src/CMakeLists.txt

file(GLOB_RECURSE SOURCES RELATIVE ${PROJECT_SOURCE_DIR} "*.cpp")
file(GLOB_RECURSE HEADERS RELATIVE ${PROJECT_SOURCE_DIR} "*.hpp")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM