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