我正在尝试将 gtest 包含到我的项目中。
问题是我在 GTest 中收到 undefined reference 错误。
我正在尝试在 Gtest 中测试 Node 类。在节点的构造函数中,我使用类记录器。尽管我已将库记录器添加到 gtest-target 中,但我仍然出现有关记录器的未定义引用错误......
我猜测 CMake 不会查找 Node 内部使用的嵌套类。 仅节点本身。
脾气暴躁修复 如果我在 gtest-node.cpp 中使用 Logger,它就可以工作 gtest.cpp
/* Pseudo Code */
TEST Node
{
Logger::log("Temp Fix")
Node * n = Node(0,0,0)
}
这样,Logger 就可以直接在 gtest 中使用,这样 logger-library 将通过 cmake 添加到目标中。
我的设置(伪代码,因为我的项目比这个大得多) (https://github.com/ronsalm/LearningLunch)
├── CMakeLists.txt
├── main.cpp
├── logger
│ ├── CMakeLists.txt
│ ├── logger.cpp
│ └── logger.h
├── Node
│ ├── CMakeLists.txt
│ ├── node.cpp
│ └── node.h
└── Gtest
├── CMakeLists.txt
├── gtest-node.cpp
└── node.h
main.cpp
/* Pseudo Code */
int main()
{
Node * n = Node(0,0,0)
}
记录器.h
/* Pseudo Code */
class Logger
{
log(string)
}
记录器.cpp
/* Pseudo Code */
Logger::log(string s)
{
//write to string to file
}
节点.h
/* Pseudo Code */
class Node
{
Node(int,int,int)
}
节点.cpp
/* Pseudo Code */
Node::node(int x, int y , int z)
{
Logger::log("Create Node")
}
gtest.cpp
/* Pseudo Code */
TEST Node
{
Node * n = Node(0,0,0)
}
CMakeLists.txt(根)
project(applic)
include_directories(
"${CMAKE_SOURE_DIR/node"
"${CMAKE_SOURE_DIR/logger")
add_library(node node.cpp)
add_executable(applic main.cpp)
target_link_libraries(applic logger node)
CMakeLists.txt(记录器)
add_library(logger logger.cpp)
CMakeLists.txt(节点)
add_library(node node.cpp)
CMakeLists.txt(Gtest)
add_executable(gtest-node gtest-node.cpp)
set_target_properties(gtest-node PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
target_link_libraries(gtest-logger gtest phtread logger node)
add_test(NAME node COMMAND $<TARGET_FILE:gtest-node>
enable_testing()
原来的错误:
../../../../lib/libdatabase.a(sql.cpp.o): In function `SQL::Open()':
/home/rsalm/test/src/database/sql/sql.cpp:19: undefined reference to `Logger::TagDebug'
/home/rsalm/test/src/database/sql/sql.cpp:19: undefined reference to `Logger::instance(std::string const&) '
../../../../lib/libdatabase.a(sql.cpp.o): In function `SQL::Close()':
/home/rsalm/test/src/database/sql/sql.cpp:27: undefined reference to `Logger::TagDebug'
/home/rsalm/test/src/database/sql/sql.cpp:27: undefined reference to `Logger::instance(std::string const&) '
../../../../lib/libdatabase.a(sql.cpp.o): In function `Logger& operator<< <char [25]>(Logger&, char const (&) [25]) ':
/home/rsalm/test/inc/logger.h:33: undefined reference to `Logger::pInstance'
../../../../lib/libdatabase.a(sql.cpp.o): In function `Logger& operator<< <char [21]>(Logger&, char const (&) [21]) ':
/home/rsalm/test/inc/logger.h:33: undefined reference to `Logger::pInstance'
../../../../lib/libdatabase.a(sql.cpp.o): In function `Logger& operator<< <char [26]>(Logger&, char const (&) [26]) ':
/home/rsalm/test/inc/logger.h:33: undefined reference to `Logger::pInstance'
../../../../lib/libdatabase.a(sql.cpp.o): In function `Logger& operator<< <char [24]>(Logger&, char const (&) [24]) ':
/home/rsalm/test/inc/logger.h:33: undefined reference to `Logger::pInstance'
collect2: error: ld returned 1 exit status
src/layout/gtest/CMakeFiles/gtest-layout-factory.dir/build.make:98: recipe for target '../bin/gtest-layout-factory' failed
make[2]: *** [../bin/gtest-layout-factory] Error 1
CMakeFiles/Makefile2:1824: recipe for target 'src/layout/gtest/CMakeFiles/gtest-layout-factory.dir/all' failed
最佳答案
您的node
库使用 logger
库,但您尚未指定该链接关系。您需要添加以下内容:
target_link_library(node PRIVATE logger)
然后,任何时候您链接到node
,CMake 将附加 logger
链接库 if node
被构建为静态库。
您几乎逃脱了对 gtest-logger
链接所做的事情。您明确添加 logger
的目标那里的图书馆,假设你实际上是说 gtest-node
而不是gtest-logger
在对 target_link_library()
的通话中。如果您列出了 logger
之后node
,我希望构建能够正常工作(假设目标名称拼写错误),但这不是正确的方法。您应该只需要明确列出 logger
作为 gtest-logger
的链接依赖项如果gtest.cpp
中有什么直接引用了 Logger
中的内容类。
关于c++ - CMake - 未定义引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43964691/