3

我想在测试文件中使用 UnitTest++ 库。但是,我很难在编译时包含该库。所以这是我当前的目录结构:

tests/
  UnitTests++/
    libUnitTest++.a
    src/
      UnitTests++.h
  unit/
    test.cpp

我刚刚使用 UnitTest++入门指南来获取库设置。这是test.cpp:

// test.cpp
#include <UnitTest++.h>

TEST(FailSpectacularly)
{
 CHECK(false);
}

int main()
{
 return UnitTest::RunAllTests();
}

我目前正在尝试编译:

gcc -lUnitTest++ -L../UnitTest++/ -I../UnitTest++/src/ test.cpp

我目前正在ld: symbol(s) not found最后得到一堆输出。那么,如何在编译该程序时正确包含 UnitTest++ 库?我在 Mac 上,我还希望 Linux 机器上的人们可以轻松地运行这些相同的测试。

哇,我希望这提供了足够的信息,如果没有,请告诉我。

4

4 回答 4

1

编译test.cpp得到test.o

并使用

g++ test.o libUnitTest++.a -o ./exectest

获取 ./exectest 可执行文件

libUnitTest++.a 只是 UnitTest++ 的所有目标文件的存档。您只需要链接所有目标文件(您的测试目标文件 + libUnitTest++.a)

尝试编辑 unittest++ 附带的 makefile 并使其适合您的情况

于 2010-03-30T03:06:25.640 回答
1

我能够以以下方式构建它

gcc -L../UnitTest++/ -I../UnitTest++/src/ test.cpp -lUnitTest++ -lstdc++

或者

g++ -L../UnitTest++/ -I../UnitTest++/src/ test.cpp -lUnitTest++

自动链接到 libstdc++。


GCC 文档说:

-图书馆

-l 库

链接时搜索名为 library 的库。(将库作为单独参数的第二种选择仅用于 POSIX 合规性,不推荐。)

在命令中编写此选项的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。

因此,foo.o -lz bar.o' searches libraryz' 在文件 foo.o 之后但在 bar.o 之前。如果 bar.o 引用了 `z' 中的函数,这些函数可能不会被加载。

我想这就是为什么当您首先指定 -lUnitTest++ 然后 test.cpp 时找不到库符号的原因

于 2010-03-30T19:20:59.037 回答
0

该消息ld: symbol(s) not found表示您尚未编译该库。所以你需要进入 UnitTest++ 文件夹,编译并安装它。

我从未在 MAC 上工作过,但在 linux 中,库通常编译和安装:

./configure
make
make install

在您发布的 UnitTest++ 链接中,您应该简单地:

make install

然后,您将在操作系统的库文件夹中拥有 UnitTest++.so 库。现在可以使用 -lUnitTest++ 命令将库与您的程序链接。

于 2010-03-30T02:59:36.510 回答
0

通常你必须把 -Lsomething 放在需要它的 -lsomething 之前。

于 2010-03-30T11:44:19.327 回答