【问题标题】:Why does my C Compiler have trouble finding some header files?为什么我的 C 编译器找不到一些头文件?
【发布时间】:2012-09-15 12:10:54
【问题描述】:

我正在阅读Zed Shaw's Learn C the Hard Way 的书,我目前正在尝试使用the bstring library,为库中的一些更常见的函数编写测试以更好地学习它们。起初我在 OS X 上工作,但现在需要在 Ubuntu 机器上工作,编译器让我很伤心。

这是 Makefile:http://pastebin.com/bxCcH0w5

这是我迄今为止的单元测试(我省略了实际运行测试的函数;mu_assert 是 minunit.h 中的一个宏):

#include "minunit.h"
#include <lcthw/bstrlib.h>

char *test_bfromcstr()
{
    char *test = "asdf";
    bstring res = NULL;
    res = bfromcstr(test);

    mu_assert(res != NULL, "bstring should not be NULL.");
    mu_assert(blength(res) == (int) strlen(test), "bstring length should match our test data");
    mu_assert(strcmp((char *)bdata(res),test) == 0, "bstring data should be same.");

    bdestroy(res);

    return NULL;
}

char *test_blk2bstr()
{
    char *test = "qwerty";
    int L = 6;
    bstring res = NULL;
    res = blk2bstr(test, L);

    mu_assert(res != NULL, "bstring should not be NULL.");
    mu_assert(blength(res) == L, "bstring length should match our test data");
    mu_assert(strcmp((char *)bdata(res),test) == 0, "bstring data should be same.");

    bdestroy(res);

    return NULL;
}

这段代码在 OS X 中编译干净,但这是我在 Ubuntu 上遇到的错误:

liblcthw(master*) $ make
ar rcs build/liblcthw.a src/lcthw/bstrlib.o src/lcthw/darray_algos.o src/lcthw/darray.o src/lcthw/list_algos.o src/lcthw/list.o src/lcthw/radixmap.o
ranlib build/liblcthw.a
cc -shared -o build/liblcthw.so src/lcthw/bstrlib.o src/lcthw/darray_algos.o src/lcthw/darray.o src/lcthw/list_algos.o src/lcthw/list.o src/lcthw/radixmap.o
cc -g -O2 -Wall -Wextra -Isrc/ -rdynamic -DNDEBUG  build/liblcthw.a    tests/bstr_tests.c   -o tests/bstr_tests
tests/bstr_tests.c: In function ‘test_bfromcstr’:
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c: In function ‘test_blk2bstr’:
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c: In function ‘main’:
tests/bstr_tests.c:136:1: warning: parameter ‘argc’ set but not used [-Wunused-but-set-parameter]
/tmp/ccZEG4Lr.o: In function `test_bfromcstr':
/home/blochs/cproject/liblcthw/tests/bstr_tests.c:8: undefined reference to `bfromcstr'
/home/blochs/cproject/liblcthw/tests/bstr_tests.c:14: undefined reference to `bdestroy'
/tmp/ccZEG4Lr.o: In function `test_blk2bstr':
/home/blochs/cproject/liblcthw/tests/bstr_tests.c:24: undefined reference to `blk2bstr'
/home/blochs/cproject/liblcthw/tests/bstr_tests.c:30: undefined reference to `bdestroy'
collect2: ld returned 1 exit status
make: *** [tests/bstr_tests] Error 1
liblcthw(master*) $

编辑

根据已被删除的评论,我修改了 Makefile 以在 CFLAGS 中包含 -lBuild 并在 cc 命令的 end 中添加 -llcthw(谢谢,gcc,用于关心选项标志的位置......)。测试文件现在可以编译,但测试本身失败并出现以下错误:

liblcthw(master*) $ make
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG  -fPIC   -c -o src/lcthw/bstrlib.o src/lcthw/bstrlib.c
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG  -fPIC   -c -o src/lcthw/darray_algos.o src/lcthw/darray_algos.c
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG  -fPIC   -c -o src/lcthw/darray.o src/lcthw/darray.c
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG  -fPIC   -c -o src/lcthw/list_algos.o src/lcthw/list_algos.c
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG  -fPIC   -c -o src/lcthw/list.o src/lcthw/list.c
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG  -fPIC   -c -o src/lcthw/radixmap.o src/lcthw/radixmap.c
ar rcs build/liblcthw.a src/lcthw/bstrlib.o src/lcthw/darray_algos.o src/lcthw/darray.o src/lcthw/list_algos.o src/lcthw/list.o src/lcthw/radixmap.o
ranlib build/liblcthw.a
cc -shared -o build/liblcthw.so src/lcthw/bstrlib.o src/lcthw/darray_algos.o src/lcthw/darray.o src/lcthw/list_algos.o src/lcthw/list.o src/lcthw/radixmap.o
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG  -Lbuild tests/bstr_tests.c -o tests/bstr_tests -llcthw -lbsd
tests/bstr_tests.c: In function ‘test_bfromcstr’:
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:12:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c: In function ‘test_blk2bstr’:
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c:28:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
tests/bstr_tests.c: In function ‘main’:
tests/bstr_tests.c:136:1: warning: parameter ‘argc’ set but not used [-Wunused-but-set-parameter]
sh ./tests/runtests.sh
Running unit tests:
ERROR in test tests/bstr_tests: here's tests/tests.log
------
./tests/bstr_tests: error while loading shared libraries: liblcthw.so: cannot open shared object file: No such file or directory
make: *** [tests] Error 1
liblcthw(master*) $

WTF.

【问题讨论】:

  • 头文件和编译器都没有问题:抱怨的是链接器..
  • 好的,我的链接器不工作。知道为什么吗?
  • 现在你需要告诉 runtime 链接器查看.so 文件所在的目录。 (LD_LIBRARY_PATH)
  • 虽然 OT 关于 Wnonull 错误:你想静态链接库还是要使用共享对象?
  • 我想是静态的。主要是因为这就是这本书所说的......

标签: c ubuntu compiler-construction makefile


【解决方案1】:

静态链接库

尝试将库 build/liblcthw.a 的引用 after tests/bstr_tests.c 放在 gcc 的命令行选项中,如下所示:

cc -g -O2 -Wall -Wextra -Isrc/ -rdynamic -DNDEBUG -o tests/bstr_tests tests/bstr_tests.c build/liblcthw.a

动态链接库

cc -g -O2 -Wall -Wextra -Isrc/ -rdynamic -DNDEBUG -o tests/bstr_tests tests/bstr_tests.c -Lbuild -llcthw

还将共享对象liblcthw.so 的路径添加到您尝试运行最终可执行文件的环境的变量LD_LIBRARY_PATH

【讨论】:

  • 好的,它可以编译并运行没有错误,但它仍然给我 bs 警告:warning: null argument where non-null required 该值绝对不为空,否则它不会通过测试。跨度>
  • 为我工作。我很想知道为什么会有所有这些警告,但现在所有文件都编译干净了。
  • 发出Wnonull 警告是因为bdata() 背后的宏魔法可能解析为NULL,并且strcmp() 不喜欢将NULL 传递给strcmp() 你是使用。 @JohnPBloch
  • 具体来说,在 Ubuntu 中,gcc 设置为默认的 -Wformat=1,这会启用 -Wnonnull 警告。可以通过传递 -Wformat=0-Wno-nonnull 参数来禁用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多