在 Windows 上使用 LLVM 时,CMake 无法正确链接静态库

CMake not linking static libraries properly when using LLVM on Windows

提问人:Somebody6153 提问时间:5/16/2021 最后编辑:Somebody6153 更新时间:5/16/2021 访问量:472

问:

我正在使用 Windows 10 和 CMake 来构建我的项目(使用 MinGW Makefiles 作为生成器),同时选择 Clang/Clang++ (LLVM) 作为我的编译器,因为我的语言服务器协议也适用于 Clang。

但是,当尝试将我创建的静态库链接到我的主可执行文件时,翻译单元中的任何定义都无法解析。

对于简单的娱乐:

File system
+ root/
    + main.cpp
    + foobar.cpp
    + foobar.hpp
    + CMakeLists.txt
// main.cpp
#include <iostream>
#include "foobar.hpp"

int main( int argc, char** argv ) {
    foo();

    std::cin.get();
    return 0;
}
// foobar.cpp
#include "foobar.hpp"

void foo() {
    std::cout << "bar" << std::endl;
}
// foobar.hpp
#pragma once
#ifndef FOOBAR_HEADER_H
#define FOOBAR_HEADER_H

#include <iostream>

void foo();

#endif
# CMakeLists.txt
cmake_minimum_required(VERSION 3.20)

project(linker_fail
    VERSION 1.0.0
    LANGUAGES C CXX)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_library(foobar
    foobar.cpp
    foobar.hpp)

add_executable(${PROJECT_NAME}
    main.cpp)

target_link_libraries(${PROJECT_NAME} PUBLIC
    foobar)

然后对于构建:

root> cmake -S . -B bin -G "MinGW Makefiles"
root> cmake --build bin

lld-link: error: undefined symbol: void __cdecl foo(void)

有谁知道如何解决这个问题?我应该将一些参数传递给编译器/链接器吗?还是 Clang 只是不允许静态链接?

C++ cmake clang llvm 链接器错误

评论


答: 暂无答案