我的库没有转到 cmake 中的指定目录

My libraries aren't going to the specified directory in cmake

提问人:Nico Cano 提问时间:11/9/2023 更新时间:11/9/2023 访问量:33

问:

我正在创建一个,它工作正常,但我指定了要在目录“${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin”上创建的库,但正在名为 lib{ProyectName}.lib 的构建文件夹上创建(它不应该有 lib 前缀) 这是我的CMakeLists:

cmake_minimum_required(VERSION 3.26)



add_definitions(-DUNICODE -D_UNICODE)

project(AxoSerial-MSVC)
set(CMAKE_CXX_STANDARD 17)
add_library(AxoSerial-MSVC STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/AxoSerial.cpp)
target_include_directories(AxoSerial-MSVC PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
set_target_properties(AxoSerial-MSVC
        PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin"
        CMAKE_CXX_COMPILER "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.29.30133/bin/HostX64/x64/cl.exe"
        SUFFIX ".lib"
)

project(AxoSerial-MinGW)
set(CMAKE_CXX_STANDARD 17)
add_library(AxoSerial-MinGW STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/AxoSerial.cpp
        main.cpp)
target_include_directories(AxoSerial-MinGW PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
set_target_properties(AxoSerial-MinGW
        PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin"
        CMAKE_CXX_COMPILER g++
        SUFFIX ".lib"
)


project(main)
set(CMAKE_CXX_STANDARD 17)
add_executable(main main.cpp)
target_link_libraries(main PRIVATE AxoSerial-MSVC)
target_include_directories(main PUBLIC ${CMAKE_SOURCE_DIR}/include)

这是我的目录树:

C:.
│   CMakeLists.txt
│   main.cpp
│
├───.idea
│       .gitignore
│       .name
│       AxoSerial.iml
│       misc.xml
│       modules.xml
│       workspace.xml
│
├───Build
│   │   .ninja_deps
│   │   .ninja_log
│   │   build.ninja
│   │   CMakeCache.txt
│   │   cmake_install.cmake
│   │   libAxoSerial-MinGW.lib
│   │   libAxoSerial-MSVC.lib
│   │   main.exe
│   │
│   ├───.cmake
│   │   └───api
│   │       └───v1
│   │           ├───query
│   │           │       cache-v2
│   │           │       cmakeFiles-v1
│   │           │       codemodel-v2
│   │           │       toolchains-v1
│   │           │
│   │           └───reply
│   │                   cache-v2-41e28885b8099980ddf6.json
│   │                   cmakeFiles-v1-4dd9e73c28e719aace8b.json
│   │                   codemodel-v2-c699778468e6a4bb9941.json
│   │                   directory-.-Debug-d0094a50bb2071803777.json
│   │                   index-2023-11-09T02-34-15-0214.json
│   │                   target-AxoSerial-MinGW-Debug-a763cdb921b125cef898.json
│   │                   target-AxoSerial-MSVC-Debug-bb5afb7fe9924aefe8ab.json
│   │                   target-main-Debug-503dda660556d3767039.json
│   │                   toolchains-v1-af93b67b788c93364498.json
│   │
│   ├───CMakeFiles
│   │   │   clion-Debug-log.txt
│   │   │   clion-environment.txt
│   │   │   cmake.check_cache
│   │   │   CMakeConfigureLog.yaml
│   │   │   rules.ninja
│   │   │   TargetDirectories.txt
│   │   │
│   │   ├───3.26.4
│   │   │   │   CMakeCCompiler.cmake
│   │   │   │   CMakeCXXCompiler.cmake
│   │   │   │   CMakeDetermineCompilerABI_C.bin
│   │   │   │   CMakeDetermineCompilerABI_CXX.bin
│   │   │   │   CMakeRCCompiler.cmake
│   │   │   │   CMakeSystem.cmake
│   │   │   │
│   │   │   ├───CompilerIdC
│   │   │   │   │   a.exe
│   │   │   │   │   CMakeCCompilerId.c
│   │   │   │   │
│   │   │   │   └───tmp
│   │   │   └───CompilerIdCXX
│   │   │       │   a.exe
│   │   │       │   CMakeCXXCompilerId.cpp
│   │   │       │
│   │   │       └───tmp
│   │   ├───AxoSerial-MinGW.dir
│   │   │   │   main.cpp.obj
│   │   │   │
│   │   │   └───src
│   │   │           AxoSerial.cpp.obj
│   │   │
│   │   ├───AxoSerial-MSVC.dir
│   │   │   └───src
│   │   │           AxoSerial.cpp.obj
│   │   │
│   │   ├───main.dir
│   │   │       main.cpp.obj
│   │   │
│   │   └───pkgRedirects
│   ├───MinGW
│   │   └───bin
│   ├───MSVC
│   │   └───bin
│   └───Testing
│       └───Temporary
│               LastTest.log
│
├───include
│       AxoSerial.h
│
└───src
        AxoSerial.cpp

从代码中可以看出,我尝试过:

RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin"
cmake clion

评论

0赞 Tsyvarev 11/9/2023
属性RUNTIME_OUTPUT_DIRECTORY控制 RUNTIME 工件的位置。但是 STATIC 库对应于 ARCHIVE 工件,后者由属性控制。至于前缀,它在 Windows 上的静态库中很常见。ARCHIVE_OUTPUT_DIRECTORYlib
0赞 Tsyvarev 11/9/2023
顺便说一句,为目标设置属性是无用的: CMake 不使用此类属性(但使用变量)。此外,不鼓励在源代码树中生成任何内容(例如,路径通常是指源代码树)。要参考构建树,请改用。CMAKE_CXX_COMPILERCMAKE_CXX_COMPILER${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin${CMAKE_CURRENT_BINARY_DIRECTORY}
0赞 Nico Cano 11/10/2023
如何为特定项目设置该变量?
0赞 Tsyvarev 11/10/2023
要设置哪个变量?您的问题帖子涉及许多变量。
0赞 Nico Cano 11/12/2023
唯一CMAKE_CXX_COMPILER

答:

0赞 RAM 11/9/2023 #1

从您的示例中,您设置希望您的库将被转储到其中。RUNTIME_OUTPUT_DIRECTORY

快速查看 RUNTIME_OUTPUT_DIRECTORY 上 CMake 的文档页面,我们发现该变量用于指定一个路径,其角色是“用于构建 RUNTIME 目标文件的输出目录”。

如果你点击RUNTIME的链接,你会偶然发现这个定义:

buildsystem 目标的运行时输出工件可能是:

  • 由 add_executable() 命令创建的可执行目标的可执行文件(例如 .exe)。
  • 在 DLL 平台上由 add_library() 命令和 SHARED 选项创建的共享库目标的可执行文件(例如 .dll)。

知道了这一点,如果你看一下你的示例,你会注意到你所有的库目标都是作为库而不是库创建的。STATICSHARED

(...)


add_library(AxoSerial-MSVC STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/AxoSerial.cpp)

(...)

add_library(AxoSerial-MinGW STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/AxoSerial.cpp
        main.cpp)

(...)

希望这会有所帮助。

评论

0赞 Nico Cano 11/10/2023
我已经使用@Tsyvarev所说的解决了目录问题,但现在我仍然有 lib 前缀问题,我该怎么做才能解决它?