我正在尝试链接一些目标文件,以便我可以在Codelite IDE中使用UnitTest ++编写测试。神秘的是,tutorial没有说明如何使用(不同)项目中的.o
文件。
如果我使用的是命令行,this thread告诉我该怎么做。但是,我在Codelite编辑器中遇到了更多困难。 this other thread中接受的答案是“在codelite的IDE中添加了这个,这是在链接器的选项文本框中添加的”,但是,我发现并非如此。
我在.o
广告位中添加了这些Library Search Path
文件的路径,然后在此下面的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)
答案 0 :(得分:1)
CodeLite假设您在库框中写的名称是您的值
想要传递给链接器-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
,然后输入:
-l:foo.o
-l:bar.o
在链接器选项框中,您的链接将成功(除非出现其他错误)。
当然,foo.o
和bar.o
是对象文件,而不是库,要么是静态的
或动态,所以强制链接在库搜索中找到它们是有点
即使你做对了也是一件好事。
您似乎已经编写了一些应用程序项目,现在您想编写 另一个项目,用于测试应用程序使用的功能和/或类。
这是标准解决方案三个项目的常见情况:
#include
- 头文件并链接项目A中的库。#include
构建头文件并链接项目A中的库。使项目B和C依赖于项目A.在CodeLite中,您可以使用构建顺序项目设置来执行此操作。
从长远来看,您会发现此解决方案比保持更易于维护 单元测试运行器的链接选项与应用程序生成的任何目标文件保持同步。