我如何 link 使用 cmocka?
How do I link with cmocka?
我在 Ubuntu 下使用 Eclipse。
我刚刚安装了cmocka:
Install the project...
-- Install configuration: "Debug"
-- Installing: /usr/lib/pkgconfig/cmocka.pc
-- Installing: /usr/lib/cmake/cmocka/cmocka-config.cmake
-- Installing: /usr/lib/cmake/cmocka/cmocka-config-version.cmake
-- Installing: /usr/include/cmocka.h
-- Installing: /usr/include/cmocka_pbc.h
-- Installing: /usr/lib/libcmocka.so.0.3.1
-- Installing: /usr/lib/libcmocka.so.0
-- Installing: /usr/lib/libcmocka.so
当我构建一个简单的测试项目时,出现链接器错误。从这个代码
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>
#include "factorial.h"
static void test_factorial_zeo()
{
assert_int_equal(factorial(0), 1);
}
int main(int argc, char **argv)
{
const UnitTest tests[] =
{
unit_test(test_factorial_zeo),
};
return run_tests(tests);
}
我收到这些错误:
make all
Building target: unit_test_C_code_example_project
Invoking: GCC C Linker
gcc -o "unit_test_C_code_example_project" ./test_scripts/test_factorial.o ./software_under_test/factorial.o
./test_scripts/test_factorial.o: In function `test_factorial_zeo':
/home/me/workspace/unit_test_C_code_example_project/Debug/../test_scripts/test_factorial.c:10: undefined reference to `_assert_int_equal'
./test_scripts/test_factorial.o: In function `main':
/home/me/workspace/unit_test_C_code_example_project/Debug/../test_scripts/test_factorial.c:20: undefined reference to `_run_tests'
collect2: ld returned 1 exit status
make: *** [unit_test_C_code_example_project] Error 1
**** Build Finished ****
所以,我似乎应该将 cmocka 库添加到链接器路径。但后来我得到
make all
Building target: unit_test_C_code_example_project
Invoking: GCC C Linker
gcc -o "unit_test_C_code_example_project" ./test_scripts/test_factorial.o ./software_under_test/factorial.o -llibcmocka.so.0.3.1
/usr/bin/ld: cannot find -llibcmocka.so.0.3.1
collect2: ld returned 1 exit status
make: *** [unit_test_C_code_example_project] Error 1
**** Build Finished ****
我得到与 libcmocka.so.0.3.1、libcmocka.so.0 和 libcmocka.so
相同的结果
显然,我在做一些非常基本的错误,但是什么?
ls -lAF /usr/lib/libcmocka.so*
lrwxrwxrwx 1 root root 14 Oct 21 15:03 /usr/lib/libcmocka.so -> libcmocka.so.0*
lrwxrwxrwx 1 root root 18 Oct 21 15:03 /usr/lib/libcmocka.so.0 -> libcmocka.so.0.3.1*
-rwxrwxrwx 1 root root 77216 Oct 21 15:02 /usr/lib/libcmocka.so.0.3.1*
好的,我找到了答案 here 并将引用它:
The -L option works like a search path for libraries, just like $PATH
in the shell is a search path for executable files.
And just like the shell has a default search path, the linker also has
a default library search path, with should include /usr/lib. So you
should not even need to have to use a -L/usr/lib option. The reason
why that did not work for you is that you use a full path with the -l
option.
Normally with the -l option the "extension" is left out from the file
name, as well the lib prefix, and the directory.
因此,在我的例子中,我告诉 Eclipse 使用 cmocka
link,这导致使用此命令生成 makefile
gcc -L/usr/lib -o "unit_test_C_code_example_project" ./test_scripts/test_factorial.o ./software_under_test/factorial.o -lcmocka
其中 link 成功。
当然,我知道这个,但是忘记了。哦!
我在 Ubuntu 下使用 Eclipse。
我刚刚安装了cmocka:
Install the project...
-- Install configuration: "Debug"
-- Installing: /usr/lib/pkgconfig/cmocka.pc
-- Installing: /usr/lib/cmake/cmocka/cmocka-config.cmake
-- Installing: /usr/lib/cmake/cmocka/cmocka-config-version.cmake
-- Installing: /usr/include/cmocka.h
-- Installing: /usr/include/cmocka_pbc.h
-- Installing: /usr/lib/libcmocka.so.0.3.1
-- Installing: /usr/lib/libcmocka.so.0
-- Installing: /usr/lib/libcmocka.so
当我构建一个简单的测试项目时,出现链接器错误。从这个代码
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>
#include "factorial.h"
static void test_factorial_zeo()
{
assert_int_equal(factorial(0), 1);
}
int main(int argc, char **argv)
{
const UnitTest tests[] =
{
unit_test(test_factorial_zeo),
};
return run_tests(tests);
}
我收到这些错误:
make all
Building target: unit_test_C_code_example_project
Invoking: GCC C Linker
gcc -o "unit_test_C_code_example_project" ./test_scripts/test_factorial.o ./software_under_test/factorial.o
./test_scripts/test_factorial.o: In function `test_factorial_zeo':
/home/me/workspace/unit_test_C_code_example_project/Debug/../test_scripts/test_factorial.c:10: undefined reference to `_assert_int_equal'
./test_scripts/test_factorial.o: In function `main':
/home/me/workspace/unit_test_C_code_example_project/Debug/../test_scripts/test_factorial.c:20: undefined reference to `_run_tests'
collect2: ld returned 1 exit status
make: *** [unit_test_C_code_example_project] Error 1
**** Build Finished ****
所以,我似乎应该将 cmocka 库添加到链接器路径。但后来我得到
make all
Building target: unit_test_C_code_example_project
Invoking: GCC C Linker
gcc -o "unit_test_C_code_example_project" ./test_scripts/test_factorial.o ./software_under_test/factorial.o -llibcmocka.so.0.3.1
/usr/bin/ld: cannot find -llibcmocka.so.0.3.1
collect2: ld returned 1 exit status
make: *** [unit_test_C_code_example_project] Error 1
**** Build Finished ****
我得到与 libcmocka.so.0.3.1、libcmocka.so.0 和 libcmocka.so
相同的结果显然,我在做一些非常基本的错误,但是什么?
ls -lAF /usr/lib/libcmocka.so*
lrwxrwxrwx 1 root root 14 Oct 21 15:03 /usr/lib/libcmocka.so -> libcmocka.so.0*
lrwxrwxrwx 1 root root 18 Oct 21 15:03 /usr/lib/libcmocka.so.0 -> libcmocka.so.0.3.1*
-rwxrwxrwx 1 root root 77216 Oct 21 15:02 /usr/lib/libcmocka.so.0.3.1*
好的,我找到了答案 here 并将引用它:
The -L option works like a search path for libraries, just like $PATH in the shell is a search path for executable files.
And just like the shell has a default search path, the linker also has a default library search path, with should include /usr/lib. So you should not even need to have to use a -L/usr/lib option. The reason why that did not work for you is that you use a full path with the -l option.
Normally with the -l option the "extension" is left out from the file name, as well the lib prefix, and the directory.
因此,在我的例子中,我告诉 Eclipse 使用 cmocka
link,这导致使用此命令生成 makefile
gcc -L/usr/lib -o "unit_test_C_code_example_project" ./test_scripts/test_factorial.o ./software_under_test/factorial.o -lcmocka
其中 link 成功。
当然,我知道这个,但是忘记了。哦!