CMake:是否可以仅从静态库构建可执行文件而无需源代码?

时间:2015-12-11 23:49:18

标签: cmake

我想仅从静态库(即.a文件)构建可执行文件。这是可能的,因为main()函数包含在其中一个库中。

add_executable()函数要求我提供至少一个源文件。但这不是我想要做的。

2 个答案:

答案 0 :(得分:6)

没有黑客就没有办法做到这一点。您至少需要一个* .c或* .cpp文件。

我所做的是制作一个虚拟null.cpp文件(零字节)并使用它。您也可以使用/dev/null,但这仅适用于Linux。

file(WRITE null.cpp "")

add_executable(tester
    null.cpp
)

target_link_libraries(tester
    -Wl,--whole-archive
    libtest1
    libtest2
    libtest3
    libtest4
    -Wl,--no-whole-archive
    gtest_main
)

答案 1 :(得分:5)

CMake强制执行源文件主要有两个原因:

  1. 确定文件结尾的LINKER_LANGUAGE
  2. 并非所有编译器都支持仅对象/库链接步骤(详见下文)
  3. 如果您将main()函数移到库中,请记住以下几点:Why does the order in which libraries are linked sometimes cause errors in GCC?

    因此,如果您在同一个项目中使用CMake构建库,我建议您将库(至少包含main()函数的库)更改为object library

    cmake_minimum_required(VERSION 2.8.8)
    
    project(NoSourceForExe)
    
    file(WRITE main.cc "int main() { return 0; }")
    
    add_library(MyLibrary OBJECT main.cc)
    add_executable(MyExecutable $<TARGET_OBJECTS:MyLibrary>)
    

    add_library() documentation在此列出警告:

      

    某些本机构建系统可能不喜欢仅包含目标文件的目标,因此请考虑将至少一个真实源文件添加到引用$&lt; TARGET_OBJECTS:objlib&gt;的任何目标。

    但这些很少见,并在Tests/ObjectLibrary/CMakeLists.txt中列出:

    # VS 6 and 7 generators do not add objects as sources so we need a
    # dummy object to convince the IDE to build the targets below.
    ...
    # Xcode does not seem to support targets without sources.
    

    不知道您要定位哪个主机操作系统,您可以尝试一下。

    <强>参考