我正在尝试链接一些对象文件,以便我可以在CodeLite IDE中使用UnitSest 编写测试。神秘地,教程没有说如何使用(不同)项目中的.o
文件。
如果我使用的是命令行,则此线程向我展示了如何做到这一点。但是,我在CodeLite编辑器中遇到了更多困难。在此其他线程中接受的答案说:" [i] n 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)
codeLite假设您在 libraries box中写的名称是值想要传递到链接器-l
选项。
链接器选项-lfoo
将链接器引导到搜索,首先在目录中您使用-Ldir
选项指定,然后在其默认搜索目录中指定对于文件libfoo.so
(共享库)或libfoo.a
(静态的文件)图书馆)。当找到任何一个时,它停止搜索。如果它在同一搜索目录中找到或它们都可以 libfoo.so
。如果找到所选库,将输入链接。否则链接器将给出一个错误:cannot find -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}
不存在的,并且会告诉您:cannot find -l{foo|bar}.o
有-l
选项的变体-l:name
,它指示name
是要搜索的文件的精确名称。因此,如果您从库中删除foo.o
,bar.o
box,然后输入:
-l:foo.o
-l:bar.o
在链接器选项框中,您的链接将成功(禁止其他错误)。
当然, foo.o
和 bar.o
是对象文件,而不是库,要么静态或动态的,因此强制链接在库搜索中找到它们有点即使您做对了也很笨拙。
看来您已经编写了一些申请项目,现在您想编写
这是标准解决方案为三个项目的常见情况:
- 项目A:构建一个(静态或共享)库,该库实现要测试的组件并导出其apis。
- 项目B:构建您的应用程序,
#include
-ing标题文件,并链接来自项目a。
的库 - 项目C:构建单位测试跑者,也是
#include
-ing标题文件,并从项目a。
的库链接库
使项目B和C取决于项目A。在CodeLite中,您可以使用构建顺序项目设置来完成此操作。
从长远来看,您会发现该解决方案比保持使用您的应用程序生成的任何对象文件的任何对象文件。