c++ - CMake - 未定义引用

标签 c++ cmake googletest undefined-reference

我正在尝试将 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/

相关文章:

c# - 使用按位运算从 int 日期中提取月份 (yyyyMMdd)

c++ - 如果灰显,如何访问调试和启动设置?

c++ - 使用 Gmock 模拟参数化构造函数

c++ - 如何创建需要汇总答案的单元测试?

c++ - 使用 Gmock 在 Cpp 中的另一个非虚拟方法中模拟一个非虚拟方法

c++ - 使用 bcrypt 哈希密码进行身份验证

c++ - 约束包含仅适用于概念吗?

c++ - SDL2 - 未检测到操纵杆?

cmake - 使用 CMake 时忽略外部模块中的警告

c++ - 如何在 CLion 中启用 C++11?