CMake:是不是可以仅从静态库而不是源代码构建可执行文件?
Posted
技术标签:
【中文标题】CMake:是不是可以仅从静态库而不是源代码构建可执行文件?【英文标题】:CMake: Is it possible to build an executable from only static libraries and no source?CMake:是否可以仅从静态库而不是源代码构建可执行文件? 【发布时间】:2015-12-11 23:49:17 【问题描述】:我只想从静态库(即 .a 文件)构建可执行文件。这是可能的,因为main()
函数包含在这些库之一中。
add_executable()
函数要求我至少提供一个源文件。但这不是我想做的。
【问题讨论】:
你可以只添加一个不定义符号的简单源文件吗? 【参考方案1】:没有黑客就没有办法做到这一点。您至少需要一个 *.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
)
【讨论】:
我认为会有一种“标准化”的 CMake 方式来做到这一点。但是这种解决方法也有效。感谢您的回答! 通过使用"$CMAKE_CURRENT_BINARY_DIR/null.cpp"
而不仅仅是null.cpp
,您可以保持源代码树干净。【参考方案2】:
CMake 强制执行源文件主要有两个原因:
-
从文件结尾确定
LINKER_LANGUAGE
并非所有编译器都支持仅对象/库链接步骤(详情见下文)
如果您将 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 在此处列出警告:
一些原生构建系统可能不喜欢只有目标文件的目标,因此请考虑将至少一个真实源文件添加到任何引用 $
的目标。
但那些很少见,列在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 containing main CMake/Tutorials/Object Library【讨论】:
真的很有用..我遇到过这个教程cmake.org/Wiki/CMake/Tutorials/Object_Library但是从没想过它也可以用来以一种非常简洁的方式添加可执行文件..以上是关于CMake:是不是可以仅从静态库而不是源代码构建可执行文件?的主要内容,如果未能解决你的问题,请参考以下文章