无法从测试中的项目链接目标文件

Trouble Linking object files from project in Tests

我正在尝试 link 一些目标文件,以便我可以在 Codelite IDE 中使用 UnitTest++ 编写测试。神秘的是,tutorial 没有说明如何使用(不同的)项目中的 .o 文件。

如果我使用的是命令行,this thread shows me how to do that. However, I am having more difficulty in the Codelite editor. The accepted answer in this other thread 会说“[i]在 codelite 的 IDE 中,这是添加到 linker 的选项文本框中的,”然而,我我发现情况并非如此。

我在 Library Search Path 位置添加了这些 .o 文件的路径,然后在其正下方的 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 假定您在 Libraries 框中写入的名称是您的值 想传递给链接器 -l 选项。

链接器选项 -lfoo 指示链接器首先在目录中进行搜索 您使用 -Ldir 选项指定,然后在其默认搜索目录中, 对于文件 libfoo.so(共享库)或 libfoo.a(静态 图书馆)。当它找到任何一个时,它就会停止搜索。如果它在同一搜索目录中找到两者或它们,它将更喜欢 libfoo.so。所选库(如果找到)将输入到链接中。除此以外 链接器会报错:cannot find -lfoo.

因此,如果您指定了链接器搜索目录 - /home/me/other/project/Debug,比如说 - 在 Libraries 框中,您可能输入了 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是目标文件,不是libraries,要么是静态的 或动态的,因此强制链接在图书馆搜索中找到它们有点 即使你做对了,也很麻烦。

看来你已经写了一些应用项目,现在你想写 另一个单元测试功能的项目 and/or 类 由应用程序使用。

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

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

使项目 B 和 C 依赖于项目 A。在 CodeLite 中,您可以使用 Build Order 项目设置来做到这一点。

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