无法从测试中的项目链接目标文件
Trouble Linking object files from project in Tests
我正在尝试 link 一些目标文件,以便我可以在 Codelite IDE 中使用 UnitTest++ 编写测试。神秘的是,tutorial 没有说明如何使用(不同的)项目中的 .o
文件。
如果我使用的是命令行,this thread shows me how to do that. However, I am having more difficulty in the Codelite editor. The accepted answer in this other thread 会说“[i]在 codelite 的 IDE 中,这是添加到 linker 的选项文本框中的,”然而,我我发现情况并非如此。
我在 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 框中写入的名称是您的值
想传递给链接器 -l
选项。
链接器选项 -lfoo
指示链接器首先在目录中进行搜索
您使用 -Ldir
选项指定,然后在其默认搜索目录中,
对于文件 libfoo.so
(共享库)或 libfoo.a
(静态
图书馆)。当它找到任何一个时,它就会停止搜索。如果它在同一搜索目录中找到两者或它们,它将更喜欢
libfoo.so
。所选库(如果找到)将输入到链接中。除此以外
链接器会报错:cannot find -lfoo
.
因此,如果您指定了链接器搜索目录 - /home/me/other/project/Debug
,比如说 -
在 Libraries 框中,您可能输入了 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
是要搜索的文件的 确切名称 。因此,如果
您从 Libraries 框中删除 foo.o
、bar.o
,然后输入:
-l:foo.o
-l:bar.o
在链接器选项框中,您的链接将成功(除非出现其他错误)。
当然foo.o
和bar.o
是目标文件,不是libraries,要么是静态的
或动态的,因此强制链接在图书馆搜索中找到它们有点
即使你做对了,也很麻烦。
看来你已经写了一些应用项目,现在你想写
另一个单元测试功能的项目 and/or 类 由应用程序使用。
这是一种常见的情况,标准解决方案是 三个 个项目:
- 项目 A:构建一个(静态或共享)库来实现要测试的组件并导出它们
API。
- 项目 B:构建您的应用程序,
#include
-ing 头文件并从项目 A 链接库。
- 项目 C:构建单元测试 运行ner,还
#include
-ing 头文件并从项目 A 链接库。
使项目 B 和 C 依赖于项目 A。在 CodeLite 中,您可以使用 Build Order 项目设置来做到这一点。
您会发现此解决方案在长期 运行 中比保留更易于维护
单元测试 运行ner 的链接选项与您的应用程序生成的任何目标文件保持同步。
我正在尝试 link 一些目标文件,以便我可以在 Codelite IDE 中使用 UnitTest++ 编写测试。神秘的是,tutorial 没有说明如何使用(不同的)项目中的 .o
文件。
如果我使用的是命令行,this thread shows me how to do that. However, I am having more difficulty in the Codelite editor. The accepted answer in this other thread 会说“[i]在 codelite 的 IDE 中,这是添加到 linker 的选项文本框中的,”然而,我我发现情况并非如此。
我在 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 框中写入的名称是您的值
想传递给链接器 -l
选项。
链接器选项 -lfoo
指示链接器首先在目录中进行搜索
您使用 -Ldir
选项指定,然后在其默认搜索目录中,
对于文件 libfoo.so
(共享库)或 libfoo.a
(静态
图书馆)。当它找到任何一个时,它就会停止搜索。如果它在同一搜索目录中找到两者或它们,它将更喜欢
libfoo.so
。所选库(如果找到)将输入到链接中。除此以外
链接器会报错:cannot find -lfoo
.
因此,如果您指定了链接器搜索目录 - /home/me/other/project/Debug
,比如说 -
在 Libraries 框中,您可能输入了 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
是要搜索的文件的 确切名称 。因此,如果
您从 Libraries 框中删除 foo.o
、bar.o
,然后输入:
-l:foo.o
-l:bar.o
在链接器选项框中,您的链接将成功(除非出现其他错误)。
当然foo.o
和bar.o
是目标文件,不是libraries,要么是静态的
或动态的,因此强制链接在图书馆搜索中找到它们有点
即使你做对了,也很麻烦。
看来你已经写了一些应用项目,现在你想写 另一个单元测试功能的项目 and/or 类 由应用程序使用。
这是一种常见的情况,标准解决方案是 三个 个项目:
- 项目 A:构建一个(静态或共享)库来实现要测试的组件并导出它们 API。
- 项目 B:构建您的应用程序,
#include
-ing 头文件并从项目 A 链接库。 - 项目 C:构建单元测试 运行ner,还
#include
-ing 头文件并从项目 A 链接库。
使项目 B 和 C 依赖于项目 A。在 CodeLite 中,您可以使用 Build Order 项目设置来做到这一点。
您会发现此解决方案在长期 运行 中比保留更易于维护 单元测试 运行ner 的链接选项与您的应用程序生成的任何目标文件保持同步。