C++ 从测试中的项目链接对象文件时出现问题

C++ 从测试中的项目链接对象文件时出现问题,c++,linker,object-files,codelite,C++,Linker,Object Files,Codelite,我正在尝试链接一些对象文件,以便在CodeLiteIDE中使用UnitTest++编写测试。奇怪的是,没有说明如何使用(不同)项目中的.o文件 如果我使用的是命令行,则演示如何执行该操作。然而,我在Codelite编辑器中遇到了更多的困难。中被接受的答案是:“在codelite的IDE中,这被添加到链接器的选项文本框中。”然而,我发现情况并非如此 我将路径添加到库搜索路径点中的这些.o文件中,然后将库点中的各个文件的名称添加到正下方。当我这样做时,我得到了/usr/bin/ld:notfind-

我正在尝试链接一些对象文件,以便在CodeLiteIDE中使用UnitTest++编写测试。奇怪的是,没有说明如何使用(不同)项目中的
.o
文件

如果我使用的是命令行,则演示如何执行该操作。然而,我在Codelite编辑器中遇到了更多的困难。中被接受的答案是:“在codelite的IDE中,这被添加到链接器的选项文本框中。”然而,我发现情况并非如此

我将路径添加到
库搜索路径
点中的这些
.o
文件中,然后将
点中的各个文件的名称添加到正下方。当我这样做时,我得到了
/usr/bin/ld:notfind-l
错误。如果我省略了
点中特定文件的名称,我将得到
错误的未定义引用

我是否必须将原始项目编译为一个库来解决这个问题?还是有我看不到的解决方案?我要运行的
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)
#包括
#包括“my_class.h”
套件(MyClassTest)
{
MCFixture类
{
公众:
我的班级是我;
MCFixture():me(“a”、“b”、“c”){};
};
测试夹具(MCFixture,ConstructorTest)
{
检查是否相等(1.0,1.0);
}
}//套件(MyClassTest)

CodeLite假定您在库中写入的名称是您需要的值 要传递到链接器
-l
选项

链接器选项
-lfoo
指示链接器首先在目录中进行搜索 使用
-Ldir
选项指定,然后在其默认搜索目录中, 对于文件
libfoo.so
(共享库)或
libfoo.a
(静态库 图书馆)。当找到其中一个时,它停止搜索。如果它在同一个搜索目录中找到这两个或它们,它会更喜欢
libfoo.so
。所选库(如果找到)将输入到链接。否则 链接器将出现错误:
找不到-lfoo

因此,如果指定了链接器搜索目录-
/home/me/other/project/Debug
,那么- 在框中,您可能输入了
foo.o
bar.o
,然后 链接器将搜索文件:

/home/me/other/project/Debug/libfoo.o.{so|a}
/home/me/other/project/Debug/libbar.o.{so|a}
它不存在,并且会告诉你:
找不到-l{foo|bar}.o

-l
选项有一个变体,
-l:name
,用于指示
name
是要搜索的文件的确切名称的链接器。那么,如果 从框中删除
foo.o
bar.o
,然后输入:

-l:foo.o
-l:bar.o
在链接器选项框中,链接将成功(除非出现其他错误)

当然,
foo.o
bar.o
都是对象文件,而不是静态库 或者是动态的,因此强制链接在库搜索中查找它们有点麻烦 即使你做对了,也会有麻烦

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

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

  • 项目A:构建一个(静态或共享)库,用于实现要测试的组件并导出它们的 API
  • 项目B:构建您的应用程序,
    #包括
    -从项目A链接头文件和库
  • 项目C:构建单元测试运行程序,还包括#从项目A链接头文件和库
使项目B和C依赖于项目A。在CodeLite中,您可以使用构建顺序项目设置来实现这一点

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