0

我正在尝试安装一个 C 软件,然后制作一个使用它的测试程序。

该软件由三个文件组成:

  1. x-as-func.c
  2. x-as-func.h
  3. yh(这只有定义语句)
  4. 可执行文件 x

在生成文件中,我有一个“安装”命令:

 .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”时,一切运行正常,文件按预期复制。

但是,当我编译看起来像这样的测试程序时:

测试.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

或者如果我这样做 -ld 那么我得到

 gcc -o test random-test.c -ld x.h
 gcc: error: x.h: No such file or directory

我相信头文件和可执行文件没有链接?我对吗?我应该如何纠正这个?

4

3 回答 3

0

我不明白你的具体情况,但编译器调用中的 .h 似乎是错误的,首先。从您提供的信息中,我看到两个选项:

  1. 您需要的函数内联在头文件中。在这种情况下,您只需将其包含到您的 .c 文件中。
  2. 您在未链接到库的 .c 文件中定义的函数(至少从您的示例中我看不到您有库)。这必须解决 - 创建一个库(静态/动态 - 无论您喜欢什么,取决于您想要实现的目标)。不需要从另一个可执行文件中获取函数,除非您对动态链接有很好的经验
于 2013-09-03T06:07:21.137 回答
0

您需要使用-cgcc 的开关编译为目标文件。这会执行编译但不会链接您的程序,这意味着您可以拥有someFunctionDefinedInX尚未解析的引用(例如 )。稍后,当您需要在该引用中执行最终编译和链接时,请使用gcc myFirstUnlinkedObj.o mySecondUnlinkedObj.o. 这将查看所有对象文件,找到所有未定义的引用,并在其他对象(或源,如果有的话)文件中查找它们。然后,它将它们全部链接到您的最终可执行文件中。

您可以在这个问题中找到关于什么是目标文件的很好解释。

可以为您执行这些步骤的生成文件可能如下所示(减去您的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 相同的目录中。

于 2013-09-03T05:45:06.760 回答
0

你有两个不同的问题。

首先是您没有告诉链接器与新安装的库链接。为此,您必须使用-Land -l(small L) 选项。

第二个问题是/usr/local/include不在头文件的默认搜索路径中,需要使用-I选项添加。

于 2013-09-03T05:45:18.640 回答