【问题标题】:CMake - Undefined ReferenceCMake - 未定义的参考
【发布时间】:2017-10-13 08:45:32
【问题描述】:

我正在尝试将 gtest 包含到我的项目中。

问题是我在 GTest 中得到一个未定义的引用错误。

我正在尝试在 Gtest 中测试 Node 类。在节点的构造函数中,我使用了类记录器。虽然我已将库记录器添加到 gtest-target 我仍然是关于记录器的未定义参考错误....

我猜 CMake 不会寻找在 Node.js 中使用的嵌套类。 只有节点本身。

临时修复 如果我在 gtest-node.cpp 中使用记录器,它可以工作 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)
}

logger.h

/* Pseudo Code */
class Logger
{ 
     log(string)
}

logger.cpp

/* Pseudo Code */
Logger::log(string s)
{
//write to string to file
}

节点.h

/* Pseudo Code */
class Node
{ 
     Node(int,int,int)
}

node.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

【问题讨论】:

  • 你错过了CMakeLists.txt - "${CMAKE_SOURE_DIR/node" -> "${CMAKE_SOURE_DIR}/node""${CMAKE_SOURE_DIR/logger 中的右括号 -> "${CMAKE_SOURE_DIR}/logger"

标签: c++ cmake googletest undefined-reference


【解决方案1】:

您的node 库使用logger 库,但您尚未指定该链接关系。您需要添加以下内容:

target_link_library(node PRIVATE logger)

然后,每当您链接到 node 时,如果 node 被构建为静态库,CMake 就会将 logger 附加到链接库中。

几乎摆脱了你对gtest-logger目标的链接所做的事情,你在那里明确添加了logger库,假设你实际上是指gtest-node而不是gtest-logger在那次打电话给target_link_library()。如果您在node 之后列出了logger,我会期望构建工作(假设目标名称拼写错误),但这不是正确的方法。如果gtest.cpp 中的某些内容直接引用了Logger 类中的某些内容,则您只需要将logger 显式列为gtest-logger 的链接依赖项。

【讨论】:

  • 您可能还想查看this answer 以了解将 gtest 引入您的构建而不是嵌入源代码的替代方法。
猜你喜欢
  • 2015-09-14
  • 2014-09-20
  • 2016-07-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多