【问题标题】:CMake to give (.o) file as outputCMake将(.o)文件作为输出
【发布时间】:2020-01-11 19:59:33
【问题描述】:

我正在尝试将 mu C++ 代码编译为目标文件 (.o),但我可以以(.a、.dylib、可执行)形式获取它

我试过这个答案:Copy out plain .o files with cmake

但实际上并没有理解解决方案,它也没有工作。

我怎样才能做到这一点?

这是我的 CMake 文件:

cmake_minimum_required(VERSION 3.10)

project(myProject)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(LIBS_DIR ${PROJECT_SOURCE_DIR}/../libs)

file(GLOB SOURCES
            src/*.cpp
            )

find_library(SQLITE3
             NAMES libsqlite3.0.tbd
             )

MACRO(HEADER_DIRECTORIES return_list)
    FILE(GLOB_RECURSE new_list ${LIBS_DIR}/*.h*)
    SET(dir_list "")
    FOREACH(file_path ${new_list})
        GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
        SET(dir_list ${dir_list} ${dir_path})
    ENDFOREACH()
    LIST(REMOVE_DUPLICATES dir_list)
    SET(${return_list} ${dir_list})
ENDMACRO()

add_library(${PROJECT_NAME}_obj OBJECT ${SOURCES})


HEADER_DIRECTORIES(HDR_DIRS)

target_include_directories(${PROJECT_NAME}_obj PUBLIC
                           ${PROJECT_BINARY_DIR}
                           ${PROJECT_SOURCE_DIR}/include
                           ${PROJECT_SOURCE_DIR}/../fmt
                           ${PROJECT_SOURCE_DIR}/../include
                           ${HDR_DIRS}
                           )

target_link_libraries(${PROJECT_NAME}_obj ${SQLITE3})


【问题讨论】:

  • @Andrey 感谢您的评论,我已经尝试过了,但这给了我每个源文件作为 .o 文件。我需要整个可执行文件是一个 .o 文件
  • @MazenAk 你需要整个“可执行文件”成为一个目标文件,编译一个 single 源文件的结果吗?为什么?
  • @JaMiT 我需要获取输出文件并使用它来编译另一个可执行文件
  • @MazenAk 这就是.a 表单(静态库)的用途。

标签: c++ makefile cmake


【解决方案1】:

您不能将多个翻译单元合并到一个目标文件中(这是由于链接器 (ld util) 的特性。仅适用于库或精灵。

早期的 gcc 可以将多个文件合并到一个目标文件中,但是这个功能被删除了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多