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

cmake:使用导入的对象

  •  1
  • CodeClown42  · 技术社区  · 8 年前

    尽管如此 this duplicate 这是一个非常相似的问题,它早于我所问的方法(“导入的对象库”),它是在3.9.6~1年前添加到cmake中的(?)因此,没有一个答案能解决这个问题。


    我刚开始使用cmake,我尝试或多或少地从makefile中复制这种行为:

    foo: foo.cpp bar.o
        $(CXX) $^ -o $@
    
    bar.o:
        cp $(EXTERNAL_DIR)/bar.o .
    

    所以 bar.o 只是从外面抄进来。它没有被建造,等等。然后它被编译成 foo 目标。

    In the Cmake documentation 这看起来非常简单;要导入.o文件:

    add_library(bar OBJECT IMPORTED GLOBAL)
    set_property(TARGET bar PROPERTY IMPORTED_LOCATION ${EXTERNAL_DIR}/bar.o)
    

    要使用它:

    add_executable(foo $<TARGET_OBJECTS:bar> foo.cpp) 
    

    但是当构建运行时,我会得到所有缺失的符号 酒吧 --直截了当地说,原因很清楚:我从不把它用于任何事情。在编译器调用中没有提到它,并且在构建目录中进行grepping,在生成的任何makefile中也没有提到它。

    此外,我可以更改 IMPORTED_LOCATION 不存在的东西,它不在乎。它的运行方式完全相同。

    我在这里误解了什么?我该如何完成这项工作(而且不必添加任何内容到 EXTERNAL_DIR )?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Florian    8 年前

    您的方法看起来不错,但有一个显著的例外(cmake的文档在这里不清楚,将在cmake的下一个版本中修复;请参见 Merge Request !2216 )

    你应该使用 IMPORTED_OBJECTS 目标属性而不是 IMPORTED_LOCATION .

    见 https://cmake.org/cmake/help/git-stage/command/add_library.html#imported-libraries :

    最重要的是[ 导入的位置 }( https://cmake.org/cmake/help/git-stage/prop_tgt/IMPORTED_LOCATION.html#prop_tgt:IMPORTED_LOCATION )(及其每个配置变量 IMPORTED_LOCATION_<CONFIG> )它指定主库文件在磁盘上的位置。或者,对于对象库, IMPORTED_OBJECTS (和) IMPORTED_OBJECTS_<CONFIG> )指定对象文件在磁盘上的位置。

        2
  •  1
  •   John Zwinck    8 年前

    你所需要的就是:

    add_executable(foo foo.cpp ${EXTERNAL_DIR}/bar.o) 
    

    供将来参考,CMAKE文件 add_library(... OBJECT) 说:

    不能导入、导出、安装或链接对象库。

    这部分解释了为什么原来的方法不起作用。