使用Makefile安装软件

时间:2013-09-03 05:42:20

标签: c makefile

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

该软件包含三个文件:

  1. X-AS-func.c
  2. X-AS-func.h
  3. y.h(这只有定义语句)
  4. 可执行文件x
  5. 在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
    

    我认为头文件和可执行文件没有链接? 我对吗?我该怎么纠正这个?

3 个答案:

答案 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似乎是错误的,首先。根据您提供的信息,我看到两个选项:

  1. 您需要的功能在头文件中内联。在这种情况下,您只需将其包含在.c文件中。
  2. 您在.c文件中定义的函数未链接到库中(至少从您的示例中我没有看到您有一个库)。这必须修复 - 创建一个库(静态/动态 - 你喜欢什么,取决于你想要实现的目标)。除非您具有良好的动态链接经验,否则从其他可执行文件获取功能不是您需要的。