【问题标题】:How to find my generated shared library from cmake?如何从 cmake 中找到我生成的共享库?
【发布时间】:2020-06-07 06:33:07
【问题描述】:

我想从 cmake 创建一个共享库。我有一个简单的 test.cpp

我的CMakeLists.txt 如下所示

cmake_minimum_required(VERSION 2.8)

project (test)
set(CMAKE_BUILD_TYPE Release)

#include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_library(test SHARED /home/tuhin/test/test1/test.cpp)

但我无法找到"test" 我的.so,我看到test.dir 文件夹创建但不是.so

请帮助我理解这个问题。

【问题讨论】:

  • 在运行cmake 之后,你还在运行make 吗? CMake 只生成构建脚本,然后您必须运行它才能真正构建您的软件。我假设您使用的是make,因此,只需在与您运行cmake 命令相同的目录中运行make
  • 请提供您用于运行cmake 和随后构建 生成的构建系统(例如make)的命令。如果没有生成.so,可能是您在某个时候遇到了错误,因此请在您的问题帖子中包含错误日志
  • @Amir,你说得对,我没有运行 make 所以它没有生成。昨天我知道了这个

标签: c++ linux cmake cmakelists-options


【解决方案1】:

(我想您阅读了 cmets 并采取了相应的行动……)

(我还认为您需要一种方法来从 CMake 构建系统中找出库的放置位置)

任何目标的磁盘位置不仅取决于CMakeLists.txt,还取决于生成器的选择。 Visual Studio somethingXcode 等多配置生成器可能会将配置名称附加为附加目录,因此您只需选择不同的生成器即可获得不同的结果。

这意味着在配置阶段没有简单的方法来唯一地识别磁盘位置。另一方面,您可以在 构建 阶段非常轻松地检查这些信息:

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: $&lt;TARGET_FILE:my_test_lib&gt;")

如果你使用 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_commandcmake generator expressions的cmake文档。

【讨论】:

    猜你喜欢
    • 2021-02-24
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2021-11-21
    • 2012-09-30
    • 1970-01-01
    • 2021-04-12
    • 2016-11-03
    相关资源
    最近更新 更多