cmake - add_executable 创建两个二进制文件而不是一个
问题描述
protoc.cmake:
set(protoc_files
${protobuf_source_dir}/src/google/protobuf/compiler/main.cc
)
add_executable(protoc ${protoc_files})
target_link_libraries(protoc libprotobuf libprotoc)
add_executable(protobuf::protoc ALIAS protoc)
set(PROTOC_NAME "protoc")
set_target_properties(protoc PROPERTIES
VERSION ${protobuf_VERSION}
OUTPUT_NAME ${PROTOC_NAME})
if(WIN32)
set(PROTOC_SUFFIX ".exe")
set_target_properties(protoc PROPERTIES
SUFFIX ${PROTOC_SUFFIX})
else()
set(PROTOC_SUFFIX)
endif()
set(PROTOBUF_PROTOC_EXECUTABLE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROTOC_NAME}${PROTOC_SUFFIX}" PARENT_SCOPE)
我已经在我的项目中包含了谷歌协议缓冲区编译器的源代码,并且我使用以前的 cmake 文件来生成运行时二进制文件,但是我得到了两个可执行文件而不是一个文件:“protoc”和“protoc-3.6.1”。
我在 Ubuntu 18.04 上使用 CLion IDE 2018.1.5 和捆绑的 CMake 3.10.3。
在 Windows 上我没有这样的问题。
解决方案
正如@Tsyvarev 在评论中所说,其中一个文件实际上是另一个文件的符号链接。这就是VERSION
属性的含义。
推荐阅读
- android - 无法在 Android 开发者控制台中更改默认语言 - 缺少不存在的应用内产品翻译
- apache-nifi - NiFi SelectHiveQL - 停止为传入请求提供服务
- perl - 以第一个元素的方式对哈希值进行排序 Perl
- javascript - 如何将 express/nodejs 代码从回调地狱转换为承诺
- node.js - Node-postgres 连接到 localhost 而不是 AWS Postgres 实例
- php - 可捕获的致命错误:类 mysqli 的对象无法在第 35 行的 C:\wamp64\www\web\index.php 中转换为字符串
- database - Like 运算符不可散列 - Teradata
- selenium - UnreachableBrowserException:与远程浏览器通信时出错。它可能已经死了,并且 Command 未能干净地关闭。强行破坏
- php - Laravel 的 deleteDirectory 忽略了保留标志
- android - Android上的Unity Sqlite本地数据库奇怪的字母