CMake 通配符用于TARGET_OBJECTS
CMake Wildcard for TARGET_OBJECTS
我有以下目录结构
- CMakeLists.txt
- include
- a.hh
- lib
- CMakeLists.txt
- a.cc
- src
- CMakeLists.txt
- main.cc
- test
- CMakeLists.txt
- test.cc
我正在使用CMake编译 test.cc 使用命令
add_executable(test test.cc $<TARGET_OBJECTS:A>)
并且目标文件A.o
编译为
add_library(A OBJECT A.cc)
但是$<TARGET_OBJECTS:A>
命令很快就会变得丑陋。有没有办法告诉 CMake 将所有.o
文件包含在 lib 文件夹中以链接所有内容?
将我的评论变成答案
没有像通配符这样的内置语法来简化add_executable(test test.cc $<TARGET_OBJECTS:A>)
命令。
实际上 - 为了提高在我当前项目中处理对象库的便利性 - 我已经完全修改了我的 CMake 版本的源代码,以扩展target_link_libraries()
以接受对象库,就像它接受静态或共享库一样。
但是还有其他方法可以帮助您处理大量对象库:
- 您可以将对象库
分组为中间静态库(但这在某种程度上否定了使用对象库的效果):
add_library(A OBJECT a.cc) add_library(B OBJECT b.cc) add_library(AB $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>)
您可以"扩展"
add_executable()
的功能,例如使用以下功能:function(my_add_executable _target) foreach(_source IN ITEMS ${ARGN}) if (NOT TARGET "${_source}") list(APPEND _source_list "${_source}") else() get_target_property(_type "${_source}" TYPE) if (_type STREQUAL "OBJECT_LIBRARY") list(APPEND _source_list "$<TARGET_OBJECTS:${_source}>") else() message(SEND_ERROR "my_add_executable: '${_source}' given as parameter is not a object-library target.") endif() endif() endforeach() add_executable(${_target} ${_source_list}) endfunction(my_add_executable)
然后,您可以将源文件与对象库的名称混合在一起。为了防止混淆,我建议使用更具描述性的对象库名称(例如,通过添加"Objs"后缀):
add_library(AObjs OBJECT a.cc) ... my_add_executable(testA test.cc AObjs)
引用
- CMake 属性和扩展生成器表达式
相关文章:
- CMake "--target install"无需"--build"命令行
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- Visual Studio Professional 2013, Update 5, "No Target Architecture"
- 如何在.pro文件中为TARGET使用空格和尖括号
- antlr cpp target 的标头部分不允许使用具有默认参数的外部函数
- GotW #88 中的"It doesn’t work for references that are members of objects"是什么意思?
- 生成错误:"cannot find target for file"和"undefined reference"
- 如何在 module.reload() 之后保持 py::objects 存活
- initializer_list for heavy objects
- 你如何修复'cmake ..&&&使安装' "No rule to make target install" ?
- 如何获取字符*的实际长度?strlen 和 sizeof(target)/sizeof(target*)之间的区别?
- Makefile for host & target
- CMake: Hide -WShadow global compile flag for child target
- CMake 错误:'target is not built by this project'
- 为什么"no temporary std::string objects would arise"在有效的现代C++的第25项中说?
- 如何在 GCC 中将"non trivially copyable objects"传递到 varargs 函数中
- "No target" 在代码中"no project"问题::块
- 隐藏PIMPL-Objects拥有的成员的实现
- cudaMalloc/cudaMemcpy with embedded objects/structures
- Opengl VAO and VBO objects