CMake错误:无法将EXECUTABLE类型目标链接到其他目标
解决CMake链接GTest项目时的两个核心错误
错误1:可执行目标无法被链接
问题本质
你试图将Cryptograph这个可执行(EXECUTABLE)目标当作库链接给测试项目,但CMake仅允许链接库类型目标(INTERFACE/OBJECT/STATIC/SHARED),或显式启用ENABLE_EXPORTS的可执行文件。如果Cryptograph包含核心加密业务逻辑,它的正确定位应该是库,而非独立可执行程序。
修复方案
将核心代码转为静态/动态库(推荐)
修改Cryptograph目录下的CMakeLists.txt,把add_executable()替换为库构建指令:# 替换原有的add_executable(Cryptograph ...) add_library(Cryptograph STATIC src/cryptograph.cpp # 其他核心源文件 )若需要保留可执行入口,可额外添加一个轻量主程序目标:
add_executable(CryptographApp main.cpp) target_link_libraries(CryptographApp PRIVATE Cryptograph)特殊场景:启用可执行文件导出(不推荐,仅当必须用可执行文件做链接时)
在创建Cryptograph可执行目标时添加ENABLE_EXPORTS参数:add_executable(Cryptograph ENABLE_EXPORTS main.cpp ...)
错误2:无法连接Cryptograph.lib
问题根源
Cryptograph库目标未被正确构建,或测试项目无法找到库文件路径- 测试项目未正确关联
Cryptograph的目标依赖
修复方案
根目录CMakeLists.txt确保子目录被加载
cmake_minimum_required(VERSION 3.14) project(CryptographProject) add_subdirectory(Cryptograph) add_subdirectory(CryptographTests)测试项目正确链接库目标
在CryptographTests的CMakeLists.txt中,直接链接Cryptograph目标(CMake会自动处理路径和依赖传递):add_executable(CryptographTests test_cryptograph.cpp) target_link_libraries(CryptographTests PRIVATE Cryptograph GTest::gtest GTest::gtest_main )确保头文件路径被正确暴露
在Cryptograph的CMakeLists.txt中设置公开头目录,让测试项目自动继承:target_include_directories(Cryptograph PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
完整项目结构与配置示例
├── CMakeLists.txt(根目录) ├── Cryptograph/ │ ├── CMakeLists.txt │ ├── include/ │ │ └── cryptograph.h │ └── src/ │ └── cryptograph.cpp └── CryptographTests/ ├── CMakeLists.txt ├── binTests/(通过CMake指定输出目录) └── test_cryptograph.cpp
CryptographTests目录CMakeLists.txt补充配置
指定测试可执行文件输出到binTests目录:
set_target_properties(CryptographTests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/binTests ) # 启用GTest自动发现测试用例 include(GoogleTest) gtest_discover_tests(CryptographTests)
内容的提问来源于stack exchange,提问作者artem21215
相关产品推荐
相关产品推荐

