为什么我的C编译器找不到一些头文件?

为什么我的C编译器找不到一些头文件?,c,ubuntu,compiler-construction,makefile,C,Ubuntu,Compiler Construction,Makefile,我正在阅读这本书,目前我正在尝试使用,为库中一些更常见的函数编写测试,以便更好地学习它们。我一开始在OSX上做这个,但现在需要在Ubuntu上工作,编译器让我很伤心 以下是生成文件: 以下是我到目前为止为单元测试所做的工作(我省略了实际运行测试的函数;mu_assert是minunit.h中的一个宏): 编辑 基于一条已被删除的注释,我修改了Makefile,将-lBuild包含在CFLAGS中,并在cc命令的末尾添加-llcthw(感谢gcc关心选项标记的位置…)。测试文件现在可以编译,但测试

我正在阅读这本书,目前我正在尝试使用,为库中一些更常见的函数编写测试,以便更好地学习它们。我一开始在OSX上做这个,但现在需要在Ubuntu上工作,编译器让我很伤心

以下是生成文件:

以下是我到目前为止为单元测试所做的工作(我省略了实际运行测试的函数;mu_assert是minunit.h中的一个宏):

编辑 基于一条已被删除的注释,我修改了Makefile,将
-lBuild
包含在
CFLAGS
中,并在
cc
命令的末尾添加
-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.

静态链接库

cc -g -O2 -Wall -Wextra -Isrc/ -rdynamic -DNDEBUG -o tests/bstr_tests tests/bstr_tests.c -Lbuild -llcthw
尝试将对库
build/liblcthw.a
的引用放在
gcc
的命令行选项中的
tests/bstr\u tests.c
之后,如下所示:

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

头和编译器都没有问题:是链接器在抱怨..好的,我的链接器不工作。知道为什么吗?现在,您需要告诉运行时链接器查找该
文件所在的目录。(
LD\u LIBRARY\u PATH
)尽管OT关于
Wnonull
错误:您想静态链接库还是想使用共享对象?我想是静态的。主要是因为这是书中所说的……好吧,这使它能够编译并运行,没有错误,但它仍然给了我bs警告:
警告:null参数,其中需要非null值
值绝对不是null,否则它将无法通过测试。对我来说很有用。我很想弄清楚为什么会有这么多警告,但是现在所有的文件都编译得很干净。
Wnonull
警告是因为
bdata()
背后的宏魔法可能会解析为
NULL
,而将
NULL
传递给
strcmp()
是您正在使用的
gcc
版本所不喜欢的@具体地说,在Ubuntu中,gcc被设置为默认值,并带有
-Wformat=1
,这将启用
-Wnonnull
警告。可以通过传递
-Wformat=0
-Wno nonnull
参数来禁用它。
cc -g -O2 -Wall -Wextra -Isrc/ -rdynamic -DNDEBUG -o tests/bstr_tests tests/bstr_tests.c -Lbuild -llcthw