我正在尝试安装C软件,然后制作一个使用它的测试程序。
该软件包含三个文件:
在makefile中我有一个“install”命令:
.PHONY: install
install: all
cp ./include/x-as-func.h /usr/local/include/x.h
cp ./include/y.h /usr/local/include/y.h
cp ./x /usr/local/bin/x
当我执行“sudo make install”时,一切正常,文件将按预期复制。
然而,当我编译看起来像的测试程序时:
test.c的
#include "hubo-read-trajectory-as-func.h"
int main(){
char* s ="left_elbow.txt";
someFunctionDefinedInX(s, 0, false, false);
}
我收到错误:
gcc -o test test.c -include //usr/local/include/x.h
/tmp/cc6ru89m.o: In function `main':
test.c:(.text+0x27): undefined reference to `someFunctionDefinedInX'
collect2: ld returned 1 exit status
或者,如果我这样做 - 那么我得到
gcc -o test random-test.c -ld x.h
gcc: error: x.h: No such file or directory
我认为头文件和可执行文件没有链接? 我对吗?我该怎么纠正这个?
答案 0 :(得分:0)
您需要使用gcc的-c
开关编译为目标文件。这会执行编译但不会链接您的程序,这意味着您可以拥有尚未解析的引用(例如someFunctionDefinedInX
)。稍后,当您需要在该引用中执行最终编译和链接时,请使用gcc myFirstUnlinkedObj.o mySecondUnlinkedObj.o
。这将查看所有目标文件,查找所有未定义的引用,并在另一个对象(或源,如果有)文件中查找它们。然后它将它们全部链接在最终的可执行文件中。
您可以在this question中找到对象文件的详细说明。
可以为您执行这些步骤的makefile可能如下所示(减去install
目标):
x-as-func.o:
gcc -c x-as-func.c
my-exe-file: x-as-func.o
gcc main-file.c x-as-func.o -o my-exe-file
all: my-exe-file
当然,这是假设您的所有.c
文件与makefile存在于同一目录中。
答案 1 :(得分:0)
你有两个不同的问题。
首先,您不要告诉链接器链接新安装的库。为此,您必须使用-L
和-l
(小L)选项。
第二个问题是/usr/local/include
不在头文件的默认搜索路径中,您需要使用-I
选项添加它。
答案 2 :(得分:0)
我没有得到你的具体信息,但编译器调用中的.h似乎是错误的,首先。根据您提供的信息,我看到两个选项: