【问题标题】:How to install object files using CMake如何使用 CMake 安装目标文件
【发布时间】:2023-01-27 22:22:24
【问题描述】:

CMake中有一个对象库:

add_library( librevolta_runtime_x86 OBJECT
    crt0.S
    crti.S
    crtn.S
)

install( TARGETS librevolta_runtime_x86 EXPORT revolta
    OBJECTS DESTINATION "${CMAKE_INSTALL_PREFIX}/lib"
)

链接到我的静态库:

add_library( revolta STATIC )

target_link_libraries( revolta
PUBLIC
    librevolta-runtime-x86
)

# Install all the revolta headers into include directory and copy the built library
install( TARGETS revolta EXPORT revolta
    FILE_SET HEADERS    DESTINATION "${CMAKE_INSTALL_PREFIX}/include"
    ARCHIVE             DESTINATION "${CMAKE_INSTALL_PREFIX}/lib"
)

# Export librevolta targets 
install( EXPORT revolta DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/revolta" )

问题是一旦构建并安装了库revota,结果是:

<CMAKE_INSTALL_PREFIX>/lib/objects-Debug/librevolta-runtime-x86/crt0.S.obj
<CMAKE_INSTALL_PREFIX>/lib/objects-Debug/librevolta-runtime-x86/crti.S.obj
<CMAKE_INSTALL_PREFIX>/lib/objects-Debug/librevolta-runtime-x86/crtn.S.obj

但是我需要像这样进行安装:

<CMAKE_INSTALL_PREFIX>/lib/crt0.o
<CMAKE_INSTALL_PREFIX>/lib/crti.o
<CMAKE_INSTALL_PREFIX>/lib/crtn.o

注意:<CMAKE_INSTALL_PREFIX> 只是 CMake 变量中指定路径的占位符。

所以我需要:

  1. 将目标文件从 *.S.obj 重命名为简单的 *.o

  2. 调整路径,以便将所有目标文件安装到纯&lt;CMAKE_INSTALL_PREFIX&gt;/lib/ 目录中

  3. 由于target_link_libraries(...)依赖,补上 librevolta_runtime_x86revolta导出集的成员

    非常感谢任何愿意帮助我的人。马丁

【问题讨论】:

  • 有点离题,但您应该避免将 $[CMAKE_INSTALL_PREFIX} 添加到 DESTINATION。相对目标(例如 libinclude)始终被认为是相对于安装目录的,这样做的一个很好的副作用是 - 它使包在安装时可重定位。要使包知道特定于分发的安装目录,您可以使用 include(GNUInstallDirs) 模块,尤其是它的变量 ${CMAKE_INSTALL_LIBDIR}${CMAKE_INSTALL_INCLUDEDIR} 和其他变量。
  • @vre 感谢您的提示,我可以确认,一旦 ${CMAKE_INSTALL_LIBDIR} 被删除,它仍然指向正确的目录。
  • 我已经回答了你问题的一部分,但因为我正在打电话 - 我无法让自己回答更多。如果其他人无法完全回答,我可能会在周六/周日回复。

标签: cmake


【解决方案1】:

您是否有任何特定原因希望安装中间目标文件?这是一个重要的问题,因为静态库在链接时将被解压缩和优化 - 以 look at this question/answer 为例。

OBJECT 库在 CMake 中很有用,因为您知道代码库的某些部分会被多次编译(因为它使用相同的代码)。将这些部分耦合到一个可重用的对象库中是有意义的。

抛开这一切: 你要找的是

INSTALL(FILES file-name.abc DESTINATION dest-folder RENAME file-name.xyz)

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2018-07-16
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多