无法在测试中链接项目中的对象文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在测试中链接项目中的对象文件相关的知识,希望对你有一定的参考价值。

我试图链接一些目标文件,以便我可以在Codelite IDE中使用UnitTest ++编写测试。奇怪的是,tutorial没有说明如何使用来自(不同)项目的.o文件。

如果我使用命令行,this thread告诉我如何做到这一点。但是,我在Codelite编辑器中遇到了更多困难。 this other thread中接受的答案是“在codelite的IDE中,这是在链接器的选项文本框中添加的”,但是,我并不是这样。

我在.o点添加了这些Library Search Path文件的路径,然后我在这下面的Libraries点添加了各个文件的名称。当我这样做时,我得到/usr/bin/ld: cannot find -l<stuff>错误。如果我省略Library点中特定文件的名称,我会得到undefined reference to错误。

我是否必须将原始项目编译为库以解决此问题?还是有一个我看不到的解决方案?我要运行的my_class_test.cpp文件看起来像这样:

#include <UnitTest++/UnitTest++.h>

#include "my_class.h"

SUITE(MyClassTest)
{

class MCFixture
{
public:
    MyClass me;
    MCFixture() : me("a", "b", "c") {};
};

TEST_FIXTURE(MCFixture, ConstructorTest)
{
    CHECK_EQUAL(1.0, 1.0);
}

} //SUITE(MyClassTest)
答案

CodeLite假定您在“库”框中编写的名称是要传递给链接器-l选项的值。

链接器选项-lfoo指示链接器首先在您使用-Ldir选项指定的目录中搜索,然后在其默认搜索目录中搜索libfoo.so(共享库)或libfoo.a(静态库)文件。它会在找到任何一个时停止搜索。如果它在同一个搜索目录中找到它们或它们,它将更喜欢libfoo.so。如果找到,所选库将输入到链接。否则链接器将给出错误:cannot find -lfoo

所以,如果你已经指定了一个链接器搜索目录 - /home/me/other/project/Debug,比如说 - 并且你在库中输入了foo.obar.o,那么链接器就会搜索文件:

/home/me/other/project/Debug/libfoo.o.{so|a}
/home/me/other/project/Debug/libbar.o.{so|a}

哪个不存在,并且会告诉你:cannot find -l{foo|bar}.o

-l选项-l:name有一个变体,它指示链接器name是要搜索的文件的确切名称。因此,如果从Libraries框中删除foo.obar.o,并输入:

-l:foo.o
-l:bar.o

在链接器选项框中,您的链接将成功(除了其他错误)。

当然,foo.obar.o是目标文件,而不是库,无论是静态的还是动态的,因此即使你正确地执行它,强制链接在库搜索中找到它们也是一个障碍。

您似乎已经编写了一些应用程序项目,现在您想要编写另一个项目来测试应用程序使用的单元测试函数和/或类。

这是标准解决方案是三个项目的常见情况:

  • 项目A:构建(静态或共享)库,实现要测试的组件并导出其API。
  • 项目B:构建您的应用程序,#include头文件并链接项目A中的库。
  • 项目C:构建单元测试运行器,同时#include-header头文件并链接项目A中的库。

使项目B和C依赖于项目A.在CodeLite中,您可以使用“构建顺序”项目设置执行此操作。

从长远来看,您会发现这个解决方案比使应用程序生成的任何目标文件保持最新的单元测试运行器链接选项更易于维护。

以上是关于无法在测试中链接项目中的对象文件的主要内容,如果未能解决你的问题,请参考以下文章

无法在单元测试项目中的 Swift 中读取 JSON 文件

无法将着色器链接到 OpenGL 中的程序对象,无法调试

微信小程序代码片段

如何从片段中的 JSON 响应中的对象获取数据

在 JSP 中的 <% %> 代码片段中添加链接

使用凌空json数据的片段中的Recyclerview?