【问题标题】:native unit tests in platformIO: ld: symbol(s) not found for architecture x86_64platformIO 中的本机单元测试:ld:未找到架构 x86_64 的符号
【发布时间】:2020-10-31 11:34:56
【问题描述】:

我无法解决以下问题,需要一些帮助。我正在尝试为 arduino (c++) 项目编写单元测试。运行测试时,我收到以下错误:

g++ -o .pio/build/native/test/test_internalTimefunctions.o -c -DPLATFORMIO=50002 -DUNIT_TEST -DUNITY_INCLUDE_CONFIG_H -Iinclude -Isrc -I.pio/build/native/UnityTestLib -I/Users/dakkar/.platformio/packages/tool-unity test/test_internalTimefunctions.cpp
g++ -o .pio/build/native/program .pio/build/native/test/test_internalTimefunctions.o .pio/build/native/test/tmp_pio_test_transport.o -L.pio/build/native .pio/build/native/libUnityTestLib.a
Undefined symbols for architecture x86_64:
  "_InternalTimefunctions", referenced from:
      test_isSleeptime() in test_internalTimefunctions.o
  "InternalTimefunctionsClass::isInSleeptime(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)", referenced from:
      test_isSleeptime() in test_internalTimefunctions.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
*** [.pio/build/native/program] Error 1

复制的最小来源: src/internal/internalTimefunctions.h

#include <cstdint>

class InternalTimefunctionsClass
{
    public:
        InternalTimefunctionsClass();
        ~InternalTimefunctionsClass();
        bool isInSleeptime(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t);
};

extern InternalTimefunctionsClass InternalTimefunctions;

src/internal/internalTimefunctions.cpp

#include "internalTimefunctions.h"

InternalTimefunctionsClass InternalTimefunctions = InternalTimefunctionsClass();

bool InternalTimefunctionsClass::isInSleeptime(uint8_t hours, uint8_t minutes, uint8_t startHour, uint8_t startMinute, uint8_t endHour, uint8_t endMinute)
{
    return false;
}

test/test_internalTimefunctions.cpp

#ifdef UNIT_TEST

#include <unity.h>
#include <cstdint>
#include "internal/internalTimefunctions.h"

void test_isSleeptime()
{
    uint8_t hours = 14;
    uint8_t minutes = 0;
    uint8_t startHour = 22;
    uint8_t startMinute = 0;
    uint8_t endHour = 6;
    uint8_t endMinute = 0;

    TEST_ASSERT_FALSE(InternalTimefunctions.isInSleeptime(hours, minutes, startHour, startMinute, endHour, endMinute ));
}


int main( int argc, char **argv) {
    UNITY_BEGIN();

    RUN_TEST(test_isSleeptime);

    UNITY_END();
}

#endif

platformio.ini

platformio]

[env:native]
platform = native

要运行的命令:pio test -e native

错误信息中有什么可疑之处:

  "InternalTimefunctionsClass::isInSleeptime(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)", referenced from:

为什么使用符号字符?它应该是无符号整数?也许这就是原因,为什么找不到isInSleeptime(==未解析的符号?)

编辑:在 macOS 下构建

❯ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.29)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

【问题讨论】:

  • 我只是尝试在本机 linux 主机上运行测试。那里的错误消息似乎更合理,并有助于我的怀疑:/usr/bin/ld: test_internalTimefunctions.cpp:(.text+0x52): undefined reference to `InternalTimefunctionsClass::isInSleeptime(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)' collect2: error: ld returned 1 exit status
  • 嘿@Dakkar,你找出问题所在了吗?
  • 不,不幸的是没有。我仍然没有运行单元测试????

标签: c++ unit-testing platformio


【解决方案1】:

为什么使用符号字符?它应该是无符号整数?

8 位无符号 int 等价于 unsigned char。 不过,这不是导致您的问题的原因。

尝试按照 PlatformIO lib_dir 文档组织您的库。

对于你的例子,你可以这样做:

|--lib
|  |--internal
|  |  |--docs
|  |  |--examples
|  |  |--src
|  |     |- internalTimefunctions.cpp
|  |     |- internalTimefunctions.h
|- platformio.ini
|--src
|  |- main.c
|--test
   |--test_internal_time_functions
      |- test_internalTimefunctions.cpp

需要特别注意的事项:

  • 每个单元测试文件都需要自己的文件夹
  • 将共享代码放在/lib/{library_name}/src 目录中。我尝试将代码放入/lib/{library_name} 目录,但没有成功,所以您可能遇到了类似的问题。这对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2018-02-20
    相关资源
    最近更新 更多