当前位置:  开发笔记 > 运维 > 正文

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

如何解决《CMake:是否可以仅从静态库构建可执行文件而无需源代码?》经验,为你挑选了2个好方法。

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

add_executable()功能要求我提供至少一个源文件.但这不是我想要做的.



1> Mark Lakata..:

没有黑客就没有办法做到这一点.您至少需要一个*.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
)



2> Florian..:

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

    LINKER_LANGUAGE从文件结尾确定

    并非所有编译器都支持仅对象/库链接步骤(有关详细信息,请参见下文)

如果您将该main()功能移至库中,请记住以下内容:为什么链接库的顺序有时会导致GCC错误?

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

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 $)

add_library()文档在此处列出了警告:

某些本机构建系统可能不喜欢仅具有目标文件的目标,因此请考虑将至少一个真实源文件添加到引用$ 的任何目标.

但这些很少见并列在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.

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

参考

包含主要的CMake Object Lib

CMake/Tutorials/Object Library

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有