似乎CMake不支持定义导出或安装目标的命名空间与相应库文件名称之间的关系。
因此,例如,CMake可以轻松创建包含明确命名目标的包,例如MyOrg::MyLibrary
(使用NAMESPACE
和export(EXPORT ...)
命令的install(EXPORT ...)
选项,但实际的.a,.lib,.so或.dll文件仍会获得全局分隔的名称,例如libMyLibrary.a
:命名空间不会进入库文件名。
当然可以自己将命名空间应用于目标;在上面的示例中,您可以命名目标MyOrgMyLibrary
,从而导致库文件名,例如“libMyOrgMyLibrary.a”。我想这是可以的,除了这会使NAMESPACE
选项基本上没用(或者你最终得到名为MyOrg::MyOrgMyLibrary
的目标),让我觉得我错过了什么。
有没有办法覆盖生成的库的名称?或者CMake的“正确”方式是什么,以确保库文件得到明确的名称?
答案 0 :(得分:5)
整个命名空间的功能远没有名称暗示的那么强大。它实际上只不过是一个命名约定。我看到了大量框架中的主要优势,这些框架附带了大量的库(例如Qt),但是你是对的,它本身并不太有用。
另请注意,该机制仅关注避免CMake脚本中的名称冲突,不关于文件系统上的名称冲突。后者需要在另一个层面上解决。避免这些的最简单方法当然是将库安装到子目录中。那么你几乎只需要担心你自己的项目中的nameclashes。不幸的是,这种方法有其自身的缺点。在Unix上,不鼓励用户创建/usr/lib
的子目录,除了存储特定于应用程序的库(感谢@JPNotADragon for pointing this out)。
否则,你已经提到的常用技术如前缀适用。
我同意,此功能并不像人们希望的那样强大。但话说回来,nameclashes是一个非常重要的问题,最终合理的命名约定可能仍然是最好的解决方案。
答案 1 :(得分:2)
有没有办法覆盖生成的库的名称?
是。请参阅OUTPUT_NAME属性。
可以想象,您可以将它包装在一个函数中(未经过测试;应该给出正确的想法,但可能包含错误):
function(my_add_library NAME)
add_library(${NAME} ${ARGN})
set_target_properties(${NAME} PROPERTIES OUTPUT_NAME my_${NAME})
endfunction()