cmake导入so库_CMake与动态链接库(dll, so, dylib)

2023-05-16

使用CMake可以很方便的实现跨平台编译。如果要Link一个第三方库,需要针对平台进行设置。这里分享下如何创建一个简单的CMake工程实现Windows, Linux和macOS上的自动编译。

SDK下载

CMake下载安装

Windows

Linux

sudo apt-get install cmake

macOS

brew install cmake

注意不要在brew前面加sudo。最新的brew不再支持,用了会发生错误:

Error: Running Homebrew as root is extremely dangerous and no longer supported.

As Homebrew does not drop privileges on installation you would be giving all

build scripts full access to your system.

工程结构

project

|-- platforms

|-- win

|-- DBRx86.lib

|-- DynamsoftBarcodeReaderx86.dll

|-- linux

|-- libDynamsoftBarcodeReader.so

|-- macos

|-- libDynamsoftBarcodeReader.dylib

|-- include

|-- DynamsoftBarcodeReader.h

|-- BarcodeReader.cxx

|-- BarcodeReaderConfig.h.in

|-- CMakeLists.txt

C++代码

写了一个简单的命令行barcode reader。这里的重点是如何配置CMake,代码不解释。

可以浏览BarcodeReader.cxx

CMakeLists.txt

平台区分

if (CMAKE_HOST_WIN32)

set(WINDOWS 1)

elseif(CMAKE_HOST_APPLE)

set(MACOS 1)

elseif(CMAKE_HOST_UNIX)

set(LINUX 1)

endif()

设置动态链接库路径

if(WINDOWS)

link_directories("${PROJECT_SOURCE_DIR}/platforms/win")

elseif(LINUX)

link_directories("${PROJECT_SOURCE_DIR}/platforms/linux")

elseif(MACOS)

link_directories("${PROJECT_SOURCE_DIR}/platforms/macos")

endif()

Windows上拷贝dll文件到输出目录

if(WINDOWS)

# Copy DLL files to output directory

if(CMAKE_CL_64)

add_custom_command(TARGET BarcodeReader POST_BUILD

COMMAND ${CMAKE_COMMAND} -E copy_if_different

"${PROJECT_SOURCE_DIR}/platforms/win/DynamsoftBarcodeReaderx64.dll"

$)

else()

add_custom_command(TARGET BarcodeReader POST_BUILD

COMMAND ${CMAKE_COMMAND} -E copy_if_different

"${PROJECT_SOURCE_DIR}/platforms/win/DynamsoftBarcodeReaderx86.dll"

$)

endif()

endif()

设置安装路径

if(WINDOWS)

set(CMAKE_INSTALL_PREFIX "e:/${PROJECT_NAME}")

if(CMAKE_CL_64)

install (FILES "${PROJECT_SOURCE_DIR}/platforms/win/DynamsoftBarcodeReaderx64.dll" DESTINATION bin)

else()

install (FILES "${PROJECT_SOURCE_DIR}/platforms/win/DynamsoftBarcodeReaderx86.dll" DESTINATION bin)

endif()

elseif(LINUX)

install (FILES "${PROJECT_SOURCE_DIR}/platforms/linux/libDynamsoftBarcodeReader.so" DESTINATION lib)

elseif(MACOS)

install (FILES "${PROJECT_SOURCE_DIR}/platforms/macos/libDynamsoftBarcodeReader.dylib" DESTINATION lib)

endif()

在Windows上默认会安装到C盘,如果命令行工具没有管理员权限会安装失败。所以可以更改默认安装路径。

设置RPATH

# Set RPATH

if(WINDOWS)

else()

set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

MESSAGE( STATUS "CMAKE_INSTALL_RPATH: " "${CMAKE_INSTALL_PREFIX}/lib" )

set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

endif()

Linux和macOS上的默认路径是/usr/local。安装之后执行程序会找不到动态链接库。设置了RPATH之后就不会有问题了。

编译安装工程

生成工程文件:

mkdir build

cd build

cmake ..

Windows上默认x86。如果要用x64,需要指定generator:

cmake -G"Visual Studio 14 2015 Win64" ..

编译安装:

cmake --build . --target install

在Linux上使用命令的时候前面要加上sudo。

完整CMakeLists.txt

cmake_minimum_required (VERSION 2.6)

project (BarcodeReader)

MESSAGE( STATUS "PROJECT_NAME: " ${PROJECT_NAME} )

# The version number.

set(BarcodeReader_VERSION_MAJOR 1)

set(BarcodeReader_VERSION_MINOR 0)

# Check platforms

if (CMAKE_HOST_WIN32)

set(WINDOWS 1)

elseif(CMAKE_HOST_APPLE)

set(MACOS 1)

elseif(CMAKE_HOST_UNIX)

set(LINUX 1)

endif()

# Set RPATH

if(WINDOWS)

else()

set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

MESSAGE( STATUS "CMAKE_INSTALL_RPATH: " "${CMAKE_INSTALL_PREFIX}/lib" )

set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

endif()

# Configure a header file to pass some of the CMake settings

# to the source code

configure_file (

"${PROJECT_SOURCE_DIR}/BarcodeReaderConfig.h.in"

"${PROJECT_BINARY_DIR}/BarcodeReaderConfig.h"

)

# Add search path for include and lib files

if(WINDOWS)

link_directories("${PROJECT_SOURCE_DIR}/platforms/win")

elseif(LINUX)

link_directories("${PROJECT_SOURCE_DIR}/platforms/linux")

elseif(MACOS)

link_directories("${PROJECT_SOURCE_DIR}/platforms/macos")

endif()

include_directories("${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/include")

# Add the executable

add_executable(BarcodeReader BarcodeReader.cxx)

if(WINDOWS)

if(CMAKE_CL_64)

target_link_libraries (BarcodeReader "DBRx64")

else()

target_link_libraries (BarcodeReader "DBRx86")

endif()

else()

target_link_libraries (BarcodeReader "DynamsoftBarcodeReader")

endif()

if(WINDOWS)

# Copy DLL files to output directory

if(CMAKE_CL_64)

add_custom_command(TARGET BarcodeReader POST_BUILD

COMMAND ${CMAKE_COMMAND} -E copy_if_different

"${PROJECT_SOURCE_DIR}/platforms/win/DynamsoftBarcodeReaderx64.dll"

$)

else()

add_custom_command(TARGET BarcodeReader POST_BUILD

COMMAND ${CMAKE_COMMAND} -E copy_if_different

"${PROJECT_SOURCE_DIR}/platforms/win/DynamsoftBarcodeReaderx86.dll"

$)

endif()

endif()

# Set installation directory

if(WINDOWS)

set(CMAKE_INSTALL_PREFIX "e:/${PROJECT_NAME}")

if(CMAKE_CL_64)

install (FILES "${PROJECT_SOURCE_DIR}/platforms/win/DynamsoftBarcodeReaderx64.dll" DESTINATION bin)

else()

install (FILES "${PROJECT_SOURCE_DIR}/platforms/win/DynamsoftBarcodeReaderx86.dll" DESTINATION bin)

endif()

elseif(LINUX)

install (FILES "${PROJECT_SOURCE_DIR}/platforms/linux/libDynamsoftBarcodeReader.so" DESTINATION lib)

elseif(MACOS)

install (FILES "${PROJECT_SOURCE_DIR}/platforms/macos/libDynamsoftBarcodeReader.dylib" DESTINATION lib)

endif()

install (TARGETS BarcodeReader DESTINATION bin)

install (FILES "${PROJECT_BINARY_DIR}/BarcodeReaderConfig.h" DESTINATION include)

install (DIRECTORY "${PROJECT_SOURCE_DIR}/include" DESTINATION include)

# Use CTest

include(CTest)

add_test (BarcodeReaderRuns BarcodeReader)

源码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake导入so库_CMake与动态链接库(dll, so, dylib) 的相关文章

  • System.MissingMethodException:找不到方法?

    以前工作的 ASP NET WebForms 应用程序现在抛出此错误 System MissingMethodException 找不到方法 The DoThis方法位于同一个类上 它应该可以工作 我有一个这样的通用处理程序 public
  • 将 gcov 与 CMake/CDash 结合使用的详细指南?

    我在我的项目中使用 CMake 并设置了 cdash 服务器以进行连续 夜间构建 一切运行良好 通过设置 crontab 我们可以将每小时 每晚的构建 测试结果自动上传到我们的 cdash 服务器 我的下一步是将测试覆盖率报告添加到构建中
  • Cmake选项默认值

    如果我有一个 CMakeLists txt 文件 cmake minimum required VERSION 2 8 OPTION FOO Foo Option OFF MESSAGE FOO FOO 然后我调用 cmake 得到以下输出
  • 如何使用自定义 CMake 版本执行 Visual studio 2019 Ninja 构建?

    我正在尝试从 IDE 在 Visual Studio 2019 上使用 Ninja 构建一个项目 我想使用与 VS 2019 发行版中集成的版本不同的 CMake 版本 我已经设置了cmakeExecutable我的变量CMakeSetti
  • 如何指定CMAKE外部项目的编译器?

    我使用ExternalProject Add 包含一个外部项目 我想要的是能够做到 cmake DCMAKE CXX COMPILER
  • 如何使用 C# 和 .NET 中的 C++ 库?

    我的问题与 DLL 如何导出 C 类和泛型方法 关于没有 C 并行的 C 语言功能 密切相关 我相信你可以在extern C 只需引用 DLL 并使用 DLLImport 即可从 C 中阻止 但是您可以实例化模板化的 C 类型吗 如果 C
  • CMake 添加对安装目标的依赖

    我在使用cmake时遇到以下问题 我使用 UseDoxygen 来自http tobias rautenkranz ch cmake doxygen http tobias rautenkranz ch cmake doxygen 为我的图
  • 从 PDF 转换为 HTML [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 CMake 中运行基本的“add_custom_command”

    我只是想启动并运行一个基本的 CMake 示例 它可以运行一些基本的命令行命令 我已经研究这个有一段时间了 但没有任何运气 我完全用错了吗 任何和所有的意见将不胜感激 cmake minimum required VERSION 3 0 a
  • 转储 Windows DLL 版本的命令行工具?

    我需要一个命令行工具来转储标准 Windows DLL 版本信息 以便我可以通过 bash 脚本 Cygwin 对其进行处理 作为一名 Java 开发人员 我不太习惯 Microsoft 开发工具 尽管我对 Microsoft Visual
  • 如何使用cmake自动构建第三方库

    我在寻找什么 下载库 提取它 应用自定义补丁 运行配置 运行构建命令 我正在尝试构建的库是 Openssl Boost Thrift C ares Curl Pcre Nginx ICU JsonCPP 我想我可以使用外部模块做这些事情 h
  • Inno Setup 以字符串作为参数调用 DLL

    当我尝试使用 Inno Setup 脚本中的 DLL 时 出现异常 我认为问题出在dll代码中的这一行 StreamReader sreader new StreamReader newpath 如果我将路径硬编码为 D source tx
  • 从内存加载动态库

    是否可以从内存而不是从 mac gcc 上的文件系统加载库 在 Windows 中 我使用 MemoryModule 但它显然不跨平台兼容 首先 要做到这一点 我建议您阅读OS X ABI 动态加载器参考 https developer a
  • 将 Scala 库转换为 DLL (.NET)

    我正在尝试从 scala 类创建一个 Dll 我将 IntelliJ 与 SBT 一起使用 我已经找到了一种使用 ikvm converter 将 jar 文件转换为 Dll 的方法 现在的问题是 当我在 SBT 下使用 package 从
  • CMake source_group() 无法在分层项目设置中正常工作

    在进行更改以使 CMake 项目具有分层文件夹管理后 source group 似乎不再正常工作 CMake 只是将所有内容转储到默认过滤器中 我尝试了各种正则表达式来从父级获取每个源文件的相对文件路径 甚至对父级 CMakeLists t
  • 为什么我会收到此 Android Studio 错误:“使用 -fPIC 重新编译”?

    我正在使用 NDK 18 并使用 x86 64 NDK 独立工具链单独编译静态库 我可以成功链接它 但是当我尝试以一种不平凡的方式访问该库时 我在构建时遇到了许多错误 例如 requires dynamic R X86 64 PC32 re
  • 如何更新 C++ dll 而无需将 exe 与 lib 文件重新链接?

    首先 我指的是 Windows 环境和 VC 编译器 我想要做的是重建 Vc dll 并保持与已链接到 lib 的 exe 的兼容性 而无需重建 exe 或使用 LoadLibrary 动态加载 dll 换句话说 有没有办法向 dll 添加
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 加载 DLL 及其依赖项

    如何加载 dll 及其依赖项 我不想将每个依赖的 dll 都放在 Assembly Load 中 我宁愿只加载一个 dll 然后加载依赖项 当我的应用程序启动时 上面的 dll 不会被加载 它们仅在用户执行特定操作时加载 然后冻结 gui
  • Visual Studio 2022 CMake 预设

    我在我的项目中使用 CMake 并开始探索 CMakePresets 的可能性 我设法创建了一个默认的 Windows 预设 目前我的 Windows 默认预设将 CMAKE BUILD TYPE 设置为调试 现在我想在左侧下拉列表中选择配

随机推荐