我希望只使用静态库(即.a文件)构建可执行文件。这是可能的,因为main()
函数包含在其中一个库中。
add_executable()
函数要求我提供至少一个源文件。但这不是我想做的。
我希望只使用静态库(即.a文件)构建可执行文件。这是可能的,因为main()
函数包含在其中一个库中。
add_executable()
函数要求我提供至少一个源文件。但这不是我想做的。
没有办法在不使用hack的情况下完成它。 您需要至少一个*.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_CURRENT_BINARY_DIR}/null.cpp"
而不是仅仅使用null.cpp
,你可以保持你的源代码树的清洁。 - Max Truxa为什么 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 $<TARGET_OBJECTS:MyLibrary>)
在add_library()
文档中提到一个警告:
一些本地构建系统可能不喜欢仅包含目标文件的对象,因此请考虑向引用$<TARGET_OBJECTS:objlib>的任何目标添加至少一个真实源文件。
但那些情况很少,并且在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.
不知道你要针对哪个主机操作系统,可以试一试。
参考资料