【问题标题】:how to add prebuilt object files to executable in cmake如何将预构建的目标文件添加到cmake中的可执行文件
【发布时间】:2016-07-27 09:42:16
【问题描述】:

我有一个add_custom_target 触发一个项目的make(该项目不使用cmake!)并生成一个目标文件。我想将此目标文件添加到我项目的 cmake 中的可执行目标中。有没有办法做到这一点?

【问题讨论】:

  • 从 Cmake 3.9.6 开始,您可以导入对象库,请参阅:stackoverflow.com/q/51344020/1151724 ...虽然对于可以将路径放入变量中的单个对象来说可能更加繁琐。跨度>

标签: cmake


【解决方案1】:

我已经在我的项目中使用target_link_libraries()

target_link_libraries(
    myProgram 
    ${CMAKE_CURRENT_SOURCE_DIR}/libs/obj.o
)

任何提供给target_link_libraries() 的完整路径都被假定为要转发给链接器的文件。


对于 CMake 版本 >= 3.9,您可以使用 add_library(... OBJECT IMPORTED ..) 目标。

Cmake: Use imported object


而且 - 另请参阅 the answer from @arrowd - 有一种未记录的方式将它们直接添加到目标的源文件列表中(actually meant to support object file outputs for add_custom_command() build steps 就像你的情况一样)。

【讨论】:

  • 假设我尝试链接库,而不是常规的 .o 文件。
  • @DrEval 是的,你需要知道 CMake 在这里做什么,这是这种方法的丑陋部分。我认为这也与您的个人品味有关:外部对象文件更像是“源文件”还是“与文件链接的东西”。
【解决方案2】:
SET(OBJS
  ${CMAKE_CURRENT_SOURCE_DIR}/libs/obj.o
)

ADD_EXECUTABLE(myProgram ${OBJS} <other-sources>)

SET_SOURCE_FILES_PROPERTIES(
  ${OBJS}
  PROPERTIES
  EXTERNAL_OBJECT true
  GENERATED true
)

这对我有用。显然,必须设置这两个属性,EXTERNAL_OBJECTGENERATED

【讨论】:

  • 代码 sn-p 缺少 add_executable() 以目标文件作为参数之一的调用。它使一些读者感到困惑,例如:stackoverflow.com/questions/48209751/….
  • @Tsyvarev 您的评论非常有价值。我建议你自己编辑答案,因为已经快一年了
【解决方案3】:

您可以在add_executable()addlibrary() 中沿源列出目标文件:

add_executable(myProgram
   source.cpp
   object.o
)

唯一的事情是您需要使用add_custom_command 来生成目标文件,这样 CMake 就会知道从哪里获取它们。这也可以确保在链接myProgram 之前构建您的目标文件。

【讨论】:

  • 我已经尝试过了,但它不起作用!我做了一个详细的cmake,在链接过程中根本没有提到目标文件!我使用 ${CMAKE_CURRENT_SOURCE_DIR}/libs/objectfile.o 给出完整路径
  • 在你运行 CMake 的那一刻它是否存在?
  • 我找到了解决方案。它与您建议的类似,只是稍作修改。 :)
  • @mkmostafa 当您找到解决方案并花时间发表评论时,最好实际发布解决方案。
  • @josh mkmostafa 找到的解决方案是公认的答案
【解决方案4】:

CMake version 3.9开始:

# Imported object library
add_library(someObjsLib OBJECT IMPORTED)

set_property(TARGET someObjsLib PROPERTY 
    IMPORTED_OBJECTS /some/path/obj1.o
                     /some/path/obj2.o
)

add_executable(myExe $<TARGET_OBJECTS:someObjsLib>)

IMPORTED_OBJECTS && Professional CMake

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多