(我想您阅读了 cmets 并采取了相应的行动……)
(我还认为您需要一种方法来从 CMake 构建系统中找出库的放置位置)
任何目标的磁盘位置不仅取决于CMakeLists.txt,还取决于生成器的选择。 Visual Studio something 或 Xcode 等多配置生成器可能会将配置名称附加为附加目录,因此您只需选择不同的生成器即可获得不同的结果。
这意味着在配置阶段没有简单的方法来唯一地识别磁盘位置。另一方面,您可以在 构建 阶段非常轻松地检查这些信息:
cmake_minimum_required(VERSION 3.15)
project (lib_file_name)
add_library(my_test_lib SHARED my_test_lib.cpp)
add_custom_target(output_lib_name
ALL
COMMAND ${CMAKE_COMMAND} -E echo "my_test_lib location: $<TARGET_FILE:my_test_lib>"
)
注意add_custom_target 行:
- 添加了新目标,命名为
output_lib_name
- 它将作为构建默认目标的一部分执行 (->
ALL)
- 构建此目标的命令要求 cmake 使用 CMAke 生成器表达式输出相关目标的文件名 (-->
COMMAND ${CMAKE_COMMAND} -E echo "my_test_lib location: $<TARGET_FILE:my_test_lib>")
如果你使用 makefile 生成器运行它:
$ cmake -S /tmp -B /tmp/make-build -G "Unix Makefiles" ; cmake --build /tmp/make-build
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/make-build
Scanning dependencies of target my_test_lib
[ 50%] Building CXX object CMakeFiles/my_test_lib.dir/my_test_lib.cpp.o
[100%] Linking CXX shared library libmy_test_lib.dylib
[100%] Built target my_test_lib
Scanning dependencies of target output_lib_name
my_test_lib location: /tmp/make-build/libmy_test_lib.dylib
[100%] Built target output_lib_name
注意这一行
my_test_lib location: /tmp/make-build/libmy_test_lib.dylib
如果你使用 Xcode 生成器运行它:
配置:
$ cmake -S /tmp -B /tmp/xcode-build -G Xcode
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/xcode-build
构建发布配置:
$ cmake --build /tmp/xcode-build --config Release
........... lot of output deleted ...........
my_test_lib location: /tmp/xcode-build/Release/libmy_test_lib.dylib
** BUILD SUCCEEDED **
构建调试配置:
$ cmake --build /tmp/xcode-build --config Debug
........... lot of output deleted ...........
my_test_lib location: /tmp/xcode-build/Debug/libmy_test_lib.dylib
** BUILD SUCCEEDED **
注意不同配置构建的位置是如何不同的,而 CMake 构建系统没有任何变化。
最后,这是关于add_custom_command、cmake generator expressions的cmake文档。