- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将两个 c 文件 calutil.c
和 calutil.h
编译成一个可执行文件。这是我的生成文件:
CC = gcc
CFLAGS = -Wall -std=c11 -DNDEBUG
all: caltool
caltool: calutil.o caltool.o
$(CC) $(CFLAGS) calutil.o caltool.o
caltool.o: caltool.c
$(CC) $(CFLAGS) caltool.c -o caltool.o
calutil.o: calutil.c
$(CC) $(CFLAGS) -c calutil.c -o calutil.o
clean:
rm -rf *.o *.out
calutil.c
没有
main
,而
caltool.c
有
main.
我收到错误
ld: can't link with a main executable file
当我
make
。这是什么原因?
最佳答案
主要问题是您的某些链接方法缺少输出文件,并且您的编译缺少 -c
。
如果您使用 GNU make,以下 Makefile
就足以完成您想做的事情:
CFLAGS:=-Wall -std=c11
CPPFLAGS:=-DNDEBUG
.PHONY: all
all: caltool
caltool: caltool.o calutil.o
.PHONY: clean
clean::
$(RM) *.o
:=
而不是 =
来分配变量,以便它们在分配时而不是在评估时扩展。 Makefile
增长并拆分它时,您可能希望有多个名为 clean
的目标,它们都将被执行。在这种情况下,使用 clean::
而不是 clean:
。 rm
,它是 $(RM)
并且它包含 -f
标志以防止 Makefile
失败,以防一个或多个要删除的文件首先不存在。 clean
的模式应该是 *.[adios]
(这真的很容易记住,adios 是西类牙语的再见),以便它删除中间文件(构建自己的静态库时为 .a
)、依赖文件( .d
)、预处理器输出( .i
)和汇编程序文件 ( .s
),以防您使用 -save-temps
来查看编译器在做什么。 $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<
,因此您无需编写自己的规则。 $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@
.PHONY
以防止在用户创建具有相同名称的文件时混淆,例如 all
或 clean
。 *.out
匹配的文件,因此我删除了 clean
规则的那部分。 CPPFLAGS
而不是 CFLAGS
。预处理器标志通常都是 -D
和 -I
标志,并且还会传递给在同一项目中使用 C 预处理器的其他工具,如 splint
或 PC-Lint
。 Makefile
运行时,它正在寻找如何制作
all
,它发现对于
all
它必须制作
caltool
。对于
caltool
它发现它必须首先制作
calutil.o
和
caltool.o
。当它尝试生成
calutil.o
和
caltool.o
时,它发现它可以从
calutil.c
和
caltool.c
生成它们并且会这样做。然后它将
caltool.o
和
calutil.o
链接到
caltool
。
caltool.c
函数的
main()
。使用静态链接库后,首先放置包含
main()
的对象会很有帮助。
calutil.h
,它包含在
caltool.c
中以访问
calutil.c
提供的外部符号。您希望重建依赖于这些头文件的所有对象。在这种情况下,将以下行添加到您的 Makefile 中:
CPPFLAGS+=-MMD
-include caltool.d calutil.d
objects
,如下所示:
objects:=caltool.o calutil.o
caltool: $(objects)
-include $(objects:.o=.d)
.c
文件,您可以按如下方式更改
objects
的定义:
sources:=$(wildcard *.c)
objects:=$(sources:.c=.o)
CPPFLAGS
(大写)而不是
objects
(小写):通常对所有配置规则配方和控制
make
的内置行为的变量使用大写,在它之上构建的工具,以及经典的环境变量,其他所有的小写变量。
关于c - Makefile: "ld: can' t 与主可执行文件链接”在 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35399830/
我正在尝试创建尽可能小的 ELF。我创建了一个这样的测试文件(NASM 语法): SECTION .text dd 0xdeadbeef 使用此链接描述文件: SECTIONS { .text
GNU LD 链接器命令语言是否有条件语句? 背景:我正在为 arm cortex m0+ 开发固件,该固件由引导加载程序和应用程序组成。两者都在单独的项目中进行编译和刷新,但我使用了一个框架,其中包
我很确定 ld 有一个手册页链接器脚本语法,但我找不到它。 最佳答案 如果您更喜欢比 info 更方便的东西, 这是一个可浏览的 HTML 版本:ld.info: Scripts .但它可能不是完全最
谁能解决这个练习,这样我就能明白我错在哪里,因为有太多的 LOL 变量。 生成一个 C 代码,将其放在以下表达式之前 printf ("% ld% ld% ld \ n", lol, & lol, *
在他关于理解 Linux Kernel Initcall Mechanism 的文章中, Trevor 创建了一个用户空间程序来模拟调用 linux 驱动程序的 init_module() 的机制。
/usr/bin/ld: cannot find -ldlib /usr/bin/ld: cannot find -lcblas /usr/bin/ld: cannot find -llapack 在
我想以 json-ld 格式创建一组人,但我需要保留一些键而不是使用数组,所以我首先尝试了这个: { "@context" : { "@base" : "http://www.exampl
所以我试图围绕 JSON-LD 进行思考,我看到的所有示例主要包括嵌入“链接数据”。但我想提供对链接数据的引用(主要是因为嵌入所有数据可能会产生 10MB 的有效负载)。所以我想知道我这样做是否正确。
我在这里复制了 json-ld standard 中的示例的一部分: { "@context": { "foaf": "http://xmlns.com/foaf/0.1/", "
考虑这样一个程序: #include void foo() __attribute__((__weak__)); int main() { printf("%p\n", (void *)fo
我正在尝试使用一个名为 GLV 的小部件库对于我正在开发的应用程序。我正在运行 Linux Mint 17。我安装了所有库并成功构建了 GLV 库,但是当我尝试运行已构建的示例之一时,出现了此共享库错
在将未编辑的 JSON 数据转换为 JSON-LD 时,使用前缀和数据值为对象构造 IRI 时遇到问题。我运行的示例代码是: { "@context" : { "prefix" : "
假设我有一个 JSON 对象,它在嵌套对象中包含一些属性。 { "title": "My Blog Post", "meta": { "publishedAt": "2
我是 JSON-LD 和 LOD 的新手,所以请原谅我使用的术语。我正致力于在 JSON-LD 中创建数据模型,以描述基于欧洲数据模型 (http://pro.europeana.eu/edm-doc
我有一个玩具 x86 汇编程序,我正在用 as 编写和编译它和 ld : .text .global _start _start: movq $1, %rax movq
我正在尝试创建 Google 的结构化数据,但不知道我在做什么。我将其设置为一个组织,然后将 SD 标记工具用于我的所有产品。我将每个 JSON-LD 产品直接从标记工具而不是嵌套放入它自己的脚本标签
我正在尝试创建 Google 的结构化数据,但不知道我在做什么。我将其设置为一个组织,然后将 SD 标记工具用于我的所有产品。我将每个 JSON-LD 产品直接从标记工具而不是嵌套放入它自己的脚本标签
我正在尝试使用 vcpkg 和 ndk r20 为 android arm 构建 tesseract我必须编辑 CMakeLists.txt 并添加 glob.c 和 glob.h,因为它们不在 nd
长话短说: 有没有办法让我(没有 root 访问权限)使链接器(由 gcc 调用)不知道 /etc/ld.so.conf 中包含的目录的内容 在通过 ldconfig 缓存之后? 详细说明: 我正在尝
我想将/opt/vertica/lib64 添加到系统库路径中,所以我执行以下步骤: (1) 将/opt/vertica/lib64加入/etc/ld.so.conf,运行ldconfig, (2)
我是一名优秀的程序员,十分优秀!