- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我很难获得 Exercise 32 中的代码以艰难的方式学习 C 语言以进行编译。
我已经逐字复制了创建者的 GitHub repo 中的代码甚至克隆到一个新的存储库中。我查看了其他存储库,在我的 MacOSX 和 Ubuntu 等上进行了尝试。我似乎所做的一切都无法编译。
我正在使用 Ubuntu 12.04(见下文)。
这是我的文件结构(注意——这是我只包含直接来自练习 32 的文件时的文件结构。显然,当我克隆 git 存储库时,我得到了更多的文件。我使用 diff 来确保我所有的文件,包括我的 make 文件,在我的简化版本中与 git 存储库完全相似):
$ pwd
/usr/local/me/code/C/liblcthw
$ ls
bin LICENSE Makefile README.md src tests
$ ls tests/
list_tests.c minunit.h runtests.sh
$ ls src/lcthw/
dbg.h list.c list.h
这是我的 make 命令。
$ make
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG -fPIC -c -o src/lcthw/list.o src/lcthw/list.c
ar rcs build/liblcthw.a src/lcthw/list.o
ranlib build/liblcthw.a
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG build/liblcthw.a tests/list_tests.c -o tests/list_tests
tests/list_tests.c: In function ‘main’:
tests/list_tests.c:111:1: warning: parameter ‘argc’ set but not used [-Wunused-but-set-parameter]
/tmp/ccXlNfMl.o: In function `test_create':
/usr/local/me/code/C/liblcthw/tests/list_tests.c:13: undefined reference to `List_create'
/tmp/ccXlNfMl.o: In function `test_destroy':
/usr/local/me/code/C/liblcthw/tests/list_tests.c:22: undefined reference to `List_clear_destroy'
/tmp/ccXlNfMl.o: In function `test_push_pop':
/usr/local/me/code/C/liblcthw/tests/list_tests.c:31: undefined reference to `List_push'
/usr/local/me/code/C/liblcthw/tests/list_tests.c:34: undefined reference to `List_push'
/usr/local/me/code/C/liblcthw/tests/list_tests.c:37: undefined reference to `List_push'
/usr/local/me/code/C/liblcthw/tests/list_tests.c:41: undefined reference to `List_pop'
/usr/local/me/code/C/liblcthw/tests/list_tests.c:44: undefined reference to `List_pop'
/usr/local/me/code/C/liblcthw/tests/list_tests.c:47: undefined reference to `List_pop'
/tmp/ccXlNfMl.o: In function `test_shift':
/usr/local/me/code/C/liblcthw/tests/list_tests.c:56: undefined reference to `List_shift'
/usr/local/me/code/C/liblcthw/tests/list_tests.c:59: undefined reference to `List_shift'
/usr/local/me/code/C/liblcthw/tests/list_tests.c:62: undefined reference to `List_shift'
/tmp/ccXlNfMl.o: In function `test_remove':
/usr/local/me/code/C/liblcthw/tests/list_tests.c:74: undefined reference to `List_remove'
/tmp/ccXlNfMl.o: In function `test_unshift':
/usr/local/me/code/C/liblcthw/tests/list_tests.c:86: undefined reference to `List_unshift'
/usr/local/me/code/C/liblcthw/tests/list_tests.c:89: undefined reference to `List_unshift'
collect2: ld returned 1 exit status
make: *** [tests/list_tests] Error 1
我正在使用 Ubuntu 12.04
$ lsb_release -a
LSB Version: core-2.0-amd64:core-2.0-noarch:core-3.0-amd64:core-3.0-noarch:core-3.1-amd64:core-3.1-noarch:core-3.2-amd64:core-3.2-noarch:core-4.0-amd64:core-4.0-noarch:cxx-3.0-amd64:cxx-3.0-noarch:cxx-3.1-amd64:cxx-3.1-noarch:cxx-3.2-amd64:cxx-3.2-noarch:cxx-4.0-amd64:cxx-4.0-noarch:desktop-3.1-amd64:desktop-3.1-noarch:desktop-3.2-amd64:desktop-3.2-noarch:desktop-4.0-amd64:desktop-4.0-noarch:graphics-2.0-amd64:graphics-2.0-noarch:graphics-3.0-amd64:graphics-3.0-noarch:graphics-3.1-amd64:graphics-3.1-noarch:graphics-3.2-amd64:graphics-3.2-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-3.2-amd64:printing-3.2-noarch:printing-4.0-amd64:printing-4.0-noarch:qt4-3.1-amd64:qt4-3.1-noarch
Distributor ID: Ubuntu
Description: Ubuntu 12.04.2 LTS
Release: 12.04
Codename: precise
最佳答案
从 github 存储库下载的练习 32 代码是特定于 BSD 系统(可能还有 OS X)的平台。具体来说,BSD 系统上有一些成功构建所需的符号,但很可能在 (Linux) Ubuntu 12.04 系统上不存在。这些包括:
mergesort
heapsort
尽管如此,库和单元测试都可以成功编译,但(最终)需要上述符号的一个单元测试除外。从 tests
目录中移动单个有问题的测试将允许其他测试在 (Linux) SuSE SLES 11 系统上编译,如果对下面显示的 makefile 中的缺陷进行轻微更改。
下载问题中提到的源后:
.../liblcthw-master> ll
total 28
drwxr-xr-x 2 mahonri users 4096 May 24 21:30 bin
drwxr-xr-x 2 mahonri users 4096 May 24 21:53 build
-rw-r--r-- 1 mahonri users 1548 May 8 2012 LICENSE
-rw-r--r-- 1 mahonri users 1139 May 8 2012 Makefile
-rw-r--r-- 1 mahonri users 1069 May 8 2012 README.md
drwxr-xr-x 3 mahonri users 4096 May 24 21:52 src
drwxr-xr-x 2 mahonri users 4096 May 24 21:53 tests
可以在 Makefile
中找到缺陷。这是下载的 Makefile
的有缺陷的部分:
# The Unit Tests
.PHONY: tests
tests: CFLAGS += $(TARGET)
tests: $(TESTS)
sh ./tests/runtests.sh
一个问题是将 $(TARGET) build/liblcthw.a
的值放在 CFLAGS 的末尾不起作用。这是因为 CFLAGS 针对的是编译器,而不是链接器。因此,生成的“测试”目标未与库链接。
另一个问题是至少有一个“测试”应用程序需要数学库。
要解决这些问题,必须将 Makefile
修改为类似于以下内容:
# The Unit Tests
.PHONY: tests
tests: LDLIBS += -lm -L./build -llcthw
tests: $(TESTS)
sh ./tests/runtests.sh
要构建 liblcthw.a
并构建“测试”应用程序,请针对此目录中更新的 Makefile
运行 make
:
.../liblcthw-master> ll
total 28
drwxr-xr-x 2 mahonri users 4096 May 24 21:30 bin
drwxr-xr-x 2 mahonri users 4096 May 24 21:53 build
-rw-r--r-- 1 mahonri users 1548 May 8 2012 LICENSE
-rw-r--r-- 1 mahonri users 1139 May 8 2012 Makefile
-rw-r--r-- 1 mahonri users 1069 May 8 2012 README.md
drwxr-xr-x 3 mahonri users 4096 May 24 21:52 src
drwxr-xr-x 2 mahonri users 4096 May 24 21:53 tests
.../liblcthw-master> make
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG -fPIC -c -o src/lcthw/bstree.o src/lcthw/bstree.c
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
src/lcthw/darray_algos.c: In function ‘DArray_heapsort’:
src/lcthw/darray_algos.c:12: warning: implicit declaration of function ‘heapsort’
src/lcthw/darray_algos.c: In function ‘DArray_mergesort’:
src/lcthw/darray_algos.c:17: warning: implicit declaration of function ‘mergesort’
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/hashmap_algos.o src/lcthw/hashmap_algos.c
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG -fPIC -c -o src/lcthw/hashmap.o src/lcthw/hashmap.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
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG -fPIC -c -o src/lcthw/ringbuffer.o src/lcthw/ringbuffer.c
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG -fPIC -c -o src/lcthw/sarray.o src/lcthw/sarray.c
src/lcthw/sarray.c: In function ‘SuffixArray_create’:
src/lcthw/sarray.c:71: warning: implicit declaration of function ‘qsort_r’
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG -fPIC -c -o src/lcthw/stats.o src/lcthw/stats.c
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG -fPIC -c -o src/lcthw/tstree.o src/lcthw/tstree.c
ar rcs build/liblcthw.a src/lcthw/bstree.o src/lcthw/bstrlib.o src/lcthw/darray_algos.o src/lcthw/darray.o src/lcthw/hashmap_algos.o src/lcthw/hashmap.o src/lcthw/list_algos.o src/lcthw/list.o src/lcthw/radixmap.o src/lcthw/ringbuffer.o src/lcthw/sarray.o src/lcthw/stats.o src/lcthw/tstree.o
ranlib build/liblcthw.a
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG tests/bstree_tests.c -L./build -llcthw -o tests/bstree_tests
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG tests/bstr_tests.c -L./build -llcthw -o tests/bstr_tests
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG tests/darray_algos_tests.c -L./build -llcthw -o tests/darray_algos_tests
...
然后,makefile 继续运行测试可执行文件:
sh ./tests/runtests.sh
Running unit tests:
----
RUNNING: ./tests/bstree_tests
ALL TESTS PASSED
Tests run: 5
tests/bstree_tests PASS
tests/bstr_tests PASS
----
RUNNING: ./tests/darray_tests
ALL TESTS PASSED
Tests run: 8
tests/darray_tests PASS
----
RUNNING: ./tests/hashmap_algos_tests
ALL TESTS PASSED
Tests run: 4
tests/hashmap_algos_tests PASS
----
RUNNING: ./tests/hashmap_tests
ALL TESTS PASSED
Tests run: 5
tests/hashmap_tests PASS
----
RUNNING: ./tests/list_algos_tests
ALL TESTS PASSED
Tests run: 2
tests/list_algos_tests PASS
----
RUNNING: ./tests/list_tests
ALL TESTS PASSED
Tests run: 6
tests/list_tests PASS
----
RUNNING: ./tests/queue_tests
ALL TESTS PASSED
Tests run: 3
tests/queue_tests PASS
----
RUNNING: ./tests/radixmap_tests
ALL TESTS PASSED
Tests run: 1
tests/radixmap_tests PASS
----
RUNNING: ./tests/ringbuffer_tests
ALL TESTS PASSED
Tests run: 3
tests/ringbuffer_tests PASS
----
RUNNING: ./tests/sarray_tests
./tests/runtests.sh: line 3: 1033 Segmentation fault $VALGRIND ./$i 2>> tests/tests.log
ERROR in test tests/sarray_tests: here's tests/tests.log
------
DEBUG tests/ringbuffer_tests.c:60: ----- RUNNING: ./tests/ringbuffer_tests
DEBUG tests/ringbuffer_tests.c:53:
----- test_create
DEBUG tests/ringbuffer_tests.c:54:
----- test_read_write
DEBUG tests/ringbuffer_tests.c:55:
----- test_destroy
DEBUG tests/sarray_tests.c:46: ----- RUNNING: ./tests/sarray_tests
DEBUG tests/sarray_tests.c:39:
----- test_create
make: *** [tests] Error 1
注意:同样的缺陷似乎没有影响 OS X 8 构建(这让我自己感到困惑)。必须在 OS X 8 版本的构建中修复一个单独的缺陷。具体来说,list_algos.c
中的以下行:
...
inline List *List_merge(List *left, List *right, List_compare cmp)
{
List *result = List_create();
...
内联函数需要一个函数原型(prototype)。更改为以下内容:
...
extern List *List_merge(List *left, List *right, List_compare cmp);
inline List *List_merge(List *left, List *right, List_compare cmp)
{
List *result = List_create();
...
在这个单一的修改之后,OS X 版本能够make
成功。
关于C 编译错误 - 艰难地学习 C(Ex 32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23851098/
Elixir 文档 states那个 In addition to the Elixir file extension .ex, Elixir also supports .exs files for
明日方舟TW-EX-5突袭怎么打 TW-EX-5突袭打法详解 关卡难点:开局高压+必须抢夺留声机 必备干员:减速类辅助、夜莺/法抗盾/控制干员 打法思路: 开局扔推王或者其他强力先锋,只
明日方舟TW-EX-6突袭怎么打 TW-EX-6突袭打法详解 关卡难点:抢夺留声机 必备干员:三个先锋,地刺,减速类干员 打法思路 开局左侧扔下桃金娘和先锋,然后马上爆费,在下方扔下第二
明日方舟TW-EX-7突袭怎么打 TW-EX-7突袭打法详解 关卡难点 本关最大的难点就是敌人输出过高,突袭难度情况下高练度重装也扛不住敌人的输出,需要利用箱子的布置还有留声机的输出来解决敌人,
明日方舟TW-EX-8突袭怎么打 TW-EX-8突袭打法详解 关卡难点 关卡的翻车点有两个,一个是注意自爆兵自爆的地点一定要正好,尽量保证其自爆的地方不要波及留声机,否则影响很大,另外就是如何蒸
明日方舟TW-EX-6突袭怎么打 TW-EX-6突袭小火龙单核打法攻略 1、关卡难点 活动开启时间:07月09日16:00-07月30日03:59 关卡开启时间:07月16日16:00-07
所以我一直在研究神圣,它看起来很棒。不幸的是,我没有找到任何像我试图实现的多文件用例示例。 所以我有一个名为configuration.py的文件,它旨在包含不同的变量,这些变量将(使用神圣)插入到代
我说的是Try ... Catch ex as Exception .... End Try 如果我将异常传递给错误记录器,我应该传递异常对象 (ex) 还是 ex.ToString ?传递 ex.T
这是我最近在工作的遗留代码中遇到的一个简单的最佳实践问题。我找不到针对这个特定问题的良好引用,因为我们可以通过多种方式来实现这一目标。但是,我想知道实现这一目标的最佳和最有效的方法。下面我创建了一些发
在 C# 中,年轻的开发人员经常使用“throw ex”而不是“throw”来向父方法抛出异常。 示例: try { // do stuff that can fail } catch (Ex
我们使用下面的脚本作为 EC2 实例的用户数据。我不明白 -ex 选项的用途是什么? #!/bin/bash -ex yum update -y yum groupinstall -y "Web Se
这是 ls -R 命令的输出: .: compare.sh searchByFile.sh startup.sh temp.txt test.sh compare.sh~ search
我真的是编程新手,我正在构建一个关于运动和位置的应用程序。我无法从“词典”中获取特定项目,但“词典”并不是真正的词典。 基本上,我有一个 TableView ,其中包含从我的 Firebase Fir
所以。我正在制作一个论坛,并且我想使用 AngularJS 来构建它。 首先。 现在,我已经通过以下方式建立了与数据库的连接: prepare($sql)){ $query->bind_result(
关于泛型的两个简单问题。 下面两个函数定义是否相同? FunctionA(Exception ex); FunctionB(T ex) where T : Exception; 通用实现 (Funct
MSVC 10 和 MSVC 9 在编译我的异常框架时都生成了 4 级警告消息,尽管程序的行为似乎是正确的。异常框架相当庞大和复杂,但我已经设法将其归结为它的本质。这是一个完整的程序,您可以在 VS1
我的问题是:用 getMessage 或 toString 或两者都记录更好吗?考虑到开源引发的错误。看到评论中的问题,但没有得到答案。也许我错过了什么?不要介意记录其中之一的小性能影响,但除非有充分
当我尝试使用 create-react-app 创建一个新的 React 应用程序时,我得到以下信息: » npx create-react-app my-order Creating a new R
背景 我正在尝试将 2 个单独工作的功能结合起来,但在使它们协同工作时遇到了麻烦。 *1) 如 solr wiki 所述我可以标记一个特定的 fq,然后在我的 facet.field 中排除它。即使在
我正在尝试使用从this website下载的代码来学习 ruby 。 我被困在这一点上。 def test_you_dont_get_null_pointer_errors_when_calli
我是一名优秀的程序员,十分优秀!