蒟蒻awa 2024-02-05 15:34 采纳率: 62.5%
浏览 6

CMake错误链接库文件

问题描述

编写了一个项目,使用CMake进行构建,随后使用Make进行编译,编译时提示找不到"libjsh.dll.a",可是我并没有编写任何一个这样的库,项目也没有任何一个地方引用了这个库。
CMakeLists.txt:

# The CMake file

cmake_minimum_required  (VERSION 3.27 FATAL_ERROR )
project (JuRuoqwqShell)

# 设置STDC++17标准(filesystem库)
set (CMAKE_CXX_STANDARD 17)
set (CMAKE_CXX_STANDARD_REQUIRED ON)

# 设置编译器
set (CMAKE_CXX_COMPILER clang++)

# 设置构建输出目录
set(OUTPUT_DIR "${CMAKE_BINARY_DIR}/out/")

# 设置源文件
set (CMDS src/cmds) # 图省事qwq
set (SOURCE_FILE
    src/jsh.cpp
    src/cmd_index.cpp
    src/logger.cpp
    src/parse_cmd.cpp

    ${CMDS}/cmd_cat.cpp
    ${CMDS}/cmd_cd.cpp
    ${CMDS}/cmd_ls.cpp
    ${CMDS}/cmd_pwd.cpp
    ${CMDS}/cmd_rm.cpp
    ${CMDS}/jsh_cmds.cpp
)

# 生成二进制文件
add_executable (jsh ${SOURCE_FILE})

编译信息:

LINK : fatal error LNK1181: 无法打开输入文件“libjsh.dll.a”
clang++: error: linker command failed with exit code 1181 (use -v to see invocation)

另一种编译方法

编写了一个sh脚本,可以编译,说明代码没有问题,但是使用CMake构建出错,如何解决?
Shel脚本

rm -rf out/*
mkdir out
clang++ -c src/jsh.cpp -o jsh.o -std=c++17
echo Built jsh
clang++ -c src/cmd_index.cpp -o cmd_index.o -std=c++17
echo Built cmd_index
clang++ -c src/logger.cpp -o logger.o -std=c++17
echo Built logger
clang++ -c src/parse_cmd.cpp -o parse_cmd.o -std=c++17
echo Built parse_cmd
clang++ -c src/cmds/cmd_cat.cpp -o cmd_cat.o -std=c++17
echo Built cmd_cat
clang++ -c src/cmds/cmd_cd.cpp -o cmd_cd.o -std=c++17
echo Built cmd_cd
clang++ -c src/cmds/cmd_ls.cpp -o cmd_ls.o -std=c++17
echo Built cmd_ls
clang++ -c src/cmds/cmd_pwd.cpp -o cmd_pwd.o -std=c++17
echo Built cmd_pwd
clang++ -c src/cmds/cmd_rm.cpp -o cmd_rm.o -std=c++17
echo Built cmd_rm
clang++ -c src/cmds/jsh_cmds.cpp -o jsh_cmds.o -std=c++17
echo Built jsh_cmds

clang++ jsh.o cmd_index.o logger.o parse_cmd.o cmd_cat.o cmd_cd.o cmd_ls.o cmd_pwd.o cmd_rm.o jsh_cmds.o -o jsh.exe -std=c++17
move jsh.exe out/
rm -rf *.o
./out/jsh
  • 写回答

3条回答 默认 最新

  • 叫兽-郭老师 新星创作者: Java技术领域 2024-02-05 15:37
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    从您提供的信息来看,CMake在链接过程中尝试寻找名为"libjsh.dll.a"的库文件,这通常意味着CMake在构建动态链接库时默认添加了某些库搜索路径或命名规则。在Windows平台上,CMake默认可能期望动态链接库以".dll.a"的形式存在,但实际上您的项目并未生成这样的库。

    为了解决这个问题,请检查以下几个方面:

    1. 检查CMakeLists.txt中是否直接或间接通过find_library命令查找了"libjsh"这个库,如果有,确认该库是否存在及其正确路径。

    2. 确认是否有其他地方设置了类似target_link_libraries(jsh ...),其中包含了"libjsh"或者导致CMake误以为需要链接这个库。

    3. 如果您确实没有编写或引用任何名为"libjsh"的库,则可以暂时移除所有链接库的命令,仅保留必要的源文件编译和执行文件生成部分,观察是否还会报同样的错误。

    针对您的CMakeLists.txt,目前并没有看到显式链接任何库的部分,所以问题很可能是由于隐式设置或者误配置引起的。您可以尝试以下修改后的CMakeLists.txt:

    cmake_minimum_required (VERSION 3.27 FATAL_ERROR)
    project (JuRuoqwqShell)
    
    # 设置STDC++17标准(filesystem库)
    set (CMAKE_CXX_STANDARD 17)
    set (CMAKE_CXX_STANDARD_REQUIRED ON)
    
    # 设置编译器
    set (CMAKE_CXX_COMPILER clang++)
    
    # 设置构建输出目录
    set(OUTPUT_DIR "${CMAKE_BINARY_DIR}/out/")
    
    # 设置源文件
    set (SOURCE_FILE    
        src/jsh.cpp    
        src/cmd_index.cpp    
        src/logger.cpp    
        src/parse_cmd.cpp    
        ${CMDS}/cmd_cat.cpp    
        ${CMDS}/cmd_cd.cpp    
        ${CMDS}/cmd_ls.cpp    
        ${CMDS}/cmd_pwd.cpp    
        ${CMDS}/cmd_rm.cpp    
        ${CMDS}/jsh_cmds.cpp
    )
    
    # 添加执行文件,并指定依赖的源文件
    add_executable (jsh ${SOURCE_FILE})
    

    如果上述修改后依然存在问题,请检查项目的其他CMake脚本或者环境变量等可能影响到链接过程的地方。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月5日