首页 > 解决方案 > 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 子项目中定义,但显然情况并非如此。我一定错过了一些非常明显的东西!

标签: c++windowscmake

解决方案


推荐阅读