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

时间:2017-12-14 20:23:03

标签: c++ linker object-files codelite

我正在尝试链接一些目标文件,以便我可以在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)

1 个答案:

答案 0 :(得分:1)

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是要搜索的文件的确切名称的链接器。因此,如果 从框中删除foo.obar.o,然后输入:

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

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

当然,foo.obar.o是对象文件,而不是,要么是静态的 或动态,所以强制链接在库搜索中找到它们是有点 即使你做对了也是一件好事。

您似乎已经编写了一些应用程序项目,现在您想编写 另一个项目,用于测试应用程序使用的功能和/或类。

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

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

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

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