c++ - CMake未解析的外部符号与Windows上的子项目
问题描述
我有一个相当简单的顶级CMakeLists.txt:
cmake_minimum_required(VERSION 3.14)
project(MyProject LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_subdirectory(Api)
add_subdirectory(Cli)
包含 2 个子目录 Api 和 Cli。
API CMakeLists.txt 也相当简单:
cmake_minimum_required(VERSION 3.14)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)
add_library(Api
api.h
api.cpp
API_global.h)
target_link_libraries(Api Qt${QT_VERSION_MAJOR}::Core)
add_compile_definitions(API_LIBRARY)
来源是微不足道的:
API_global.h
#ifndef API_GLOBAL_H
#define API_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(API_LIBRARY)
#define API_EXPORT Q_DECL_EXPORT
#else
#define API_EXPORT Q_DECL_IMPORT
#endif
#endif // API_GLOBAL_H
API.h
#ifndef API_H
#define API_H
#include "API_global.h"
class API_EXPORT API
{
public:
API() = default;
void printHello() const;
};
#endif // API_H
api.cpp
#include "api.h"
void API::printHello() const {}
CLI 子项目 CMakeLists.txt 然后简单地调用
find_library(API Api HINTS ${CMAKE_BINARY_DIR}/Api)
include_directories(${PROJECT_SOURCE_DIR}/Api)
target_link_libraries(cli PUBLIC ${API})
在 main.cpp 中调用 printHello 失败
main.cpp.obj:-1: error: LNK2019: unresolved external symbol "__declspec(dllimport) public: void __cdecl API::printHello(void)const " (__imp_?printHello@API@@QEBAXXZ) referenced in function main
我首先在 Mac 上进行了测试,一切都很好。整个早上都在 Windows 上摆弄这个设置,但我无法理解它。find_library
正在按预期返回 Api.lib 。我的第一个猜测是 API_LIBRARY 仍然在 Cli 子项目中定义,但显然情况并非如此。我一定错过了一些非常明显的东西!
解决方案
推荐阅读
- elasticsearch - 气流 web-ui 无法从弹性搜索中检索日志
- node.js - 为什么 io.to(socketid).emit() 从第一次开始就不起作用?
- angular - 角度样式问题(primeng - primeflex)
- c# - 我无法在统一编辑器中创建 ac# 脚本
- visual-studio-code - VSCode 无法安装 C/C++ 扩展
- pie-chart - 将 json 数据从 PHP 传递到 javascript - Echart 饼图
- email - 如何区分电子邮件服务提供商域和公司域?
- machine-learning - 模块“tensorflow.compat.v2.__internal__”没有属性“register_clear_session_function”
- python - 跨所有模型子集 Django 表
- android - 在 linuxmint19 上对本机 cli 做出反应以进行 android 安装,给出错误