【问题标题】:Trouble Linking object files from project in Tests在测试中从项目链接目标文件时遇到问题
【发布时间】:2017-12-14 20:23:02
【问题描述】:

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

如果我使用命令行,this thread 会告诉我如何操作。但是,我在 Codelite 编辑器中遇到了更多困难。 this other thread 中接受的答案说“[i] 在 codelite 的 IDE 中,这是在链接器的选项文本框中添加的”,但是,我发现情况并非如此。

我在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)

【问题讨论】:

    标签: c++ linker object-files codelite


    【解决方案1】:

    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 是目标文件,而不是,要么是静态的 或动态的,因此强制链接以在库搜索中找到它们有点 即使你做对了,也是一个杂种。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多