How do I produce only an object file (*.o) from a CMake build target?

后端 未结 3 1286
南笙
南笙 2021-02-04 09:24

I\'m trying to build an object file using CMake, but I can\'t seem to get CMake to build something other than a complete executable. I\'m basically looking for the result of the

相关标签:
3条回答
  • 2021-02-04 09:36

    Since CMake 3.1, CMake has had the ability to create Object libraries:

    The OBJECT library type defines a non-archival collection of object files resulting from compiling the given source files.

    To only create the object file (no library or executable), use this OBJECT keyword with the add_library() command:

    # This will create object.c.o (or object.c.obj on Windows) when built.
    add_library(MyObj OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/src/object.c)
    

    You can later reference the object file(s) to be compiled into other libraries or executables:

    add_library(MyLibrary STATIC $<TARGET_OBJECTS:MyObj> MyClass1.cpp Helpers.cpp)
    
    0 讨论(0)
  • 2021-02-04 09:42

    I would go the custom command path. Remember you can still use those object files for compilation with CMake latter if you set the GENERATED and EXTERNAL_OBJECT source file properties.

    0 讨论(0)
  • 2021-02-04 10:01

    This answer was given to me in the CMake mailing list and it worked like a charm:

    Look at the following ${CMAKE_SOURCE_DIR}/cpo script:

    #!/bin/sh
    d=$1; shift
    while [ "$1" != "--" ]; do
        cp $1 $d/$(basename $1); shift
    done
    

    Now, look at the following CMakeLists.txt:

    CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
    PROJECT(CPO C) 
    FILE(WRITE ${CMAKE_BINARY_DIR}/f.c "void f(void){}\n")
    ADD_LIBRARY(f SHARED f.c)
    SET_TARGET_PROPERTIES(f PROPERTIES RULE_LAUNCH_LINK
        "${CMAKE_SOURCE_DIR}/cpo ${CMAKE_BINARY_DIR} <OBJECTS> --"
    )
    

    The launch script "cpo" makes the target "f" produce object files in the directory passed in as the first parameter instead of a library; everything else should be business as usual. The key is the script's access to the <OBJECTS> placeholder, so it can operate on the object files while the actual link command after the "--" is ignored. That way, you can use all of CMake's capabilities for the compilation and intercept right before linking takes place. IMO, that's a quite clean solution which should be easily adaptable to your needs; the downside is that the use of RULE_LAUNCH_LINK is limited to Makefile generators.

    0 讨论(0)
提交回复
热议问题