代码之家  ›  专栏  ›  技术社区  ›  code_fodder

生成依赖于共享库子项目的文件

  •  0
  • code_fodder  · 技术社区  · 7 年前

    所以我有一个makefile。我现在只举一个伪例子,这样我就可以讨论这个问题并保持简单……

    假设我的makefile中有这样的内容:

    # Rule to build my test executable - with dependency on the library mytest
    build: libmytest.so
        g++ test.cpp -lmytest.so
    
    # Rule to build mytest library
    libmytest.so:
        g++ mytestlib.cpp -fPIC   ... etc ...
        cc -fPIC -Wl,-soname,libmytest.so  ... etc...
    

    所以,如果/当我更改文件 mytestlib.cpp ,我看到,因为mylibtest.so已经存在(来自以前的构建)我的 build 规则认为它没有任何作用。

    所以我的问题是,如果我只更改库文件,如何让库进行构建,从而测试.cpp重新链接到新创建的库?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Renaud Pacalet    7 年前

    这正是我们所做的:管理依赖树。只需告诉make您的库依赖于其源:

    libmytest.so: mytestlib.cpp
        g++ mytestlib.cpp -fPIC   ... etc ...
        cc -fPIC -Wl,-soname,libmytest.so  ... etc...
    

    利用这一额外的信息,make将比较目标的最后修改时间及其前提条件。如果目标丢失或早于其任何前提条件,make将重建它。这是递归的。如果某个先决条件丢失或其本身已过时,则make将首先重建该先决条件。

    顺便说一下,不是 build 目标,这不是真正的文件名,最好直接使用产品的文件名:

    test: libmytest.so
        g++ test.cpp -lmytest.so
    

    这样,如果 test 是最新的(比 libmytest.so )make不会重建它。你会节省时间的。

    如果您真的想要一个别名,您可以添加一个假的目标:

    .PHONY: build
    
    build: test
    

    特殊条款的所有先决条件 .PHONY 目标的处理方式不同:make知道它们不是真正的文件名,即使文件名为 建造 存在,并且必须始终重建它们。在这种情况下,Make会检查 测试 存在并且是最新的,重新生成 测试 如果需要的话,停在这里,因为没什么好做的。 建造 (它没有配方)。因此,可以将其视为 测试 .

    推荐文章