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) 的相关文章

  • 如果构建是源代码外的,CMake 无法找出标头依赖项?

    我一直在使用 CMake 来管理一个单独的小型 c 项目 基于 Unix Makefile 并决定将其转换为更有组织的源代码外构建 但是 当它超出源时 通过执行cmake 在 build 中 我的标头不再是其源文件的依赖项 如果我只是从顶层
  • CMake 链接失败

    我正在为 CMake 配置我的项目 并且遇到链接问题 项目文件全部编译成功 然后它说它正在链接并报告未找到的各种符号 这些符号大部分是由我自己的代码提供的 其中一些是由 BerkeleyDB 提供的 它已被正确定位并包含在内 这是我的顶级
  • 查找带有 Anaconda cmake 前缀的 boost-python3

    DLDR如何将 cmake 指向 boost python3 库 cmake 不会自动检测到它 我正在尝试建立caffe https github com BVLC caffe对于 Python 3 6 使用提供的 cmake 我的系统规格
  • Visual Studio 找不到引用

    我正在处理另一个人移交的一些应用程序 我必须在其中记录需求 构建和部署流程 这里的问题是 Visual Studio 2005 抛出很多错误 因为它找不到 dll 的引用 这显然不会让 VS 构建该项目 在该人的计算机上一切正常 但在我的计
  • 如何在 C# 库中创建全局对象[重复]

    这个问题在这里已经有答案了 可能的重复 使整个应用程序可以访问数据 可能在运行时发生变化 的最佳方法是什么 https stackoverflow com questions 11781131 best way to make data t
  • CMake错误:本项目中使用了以下变量,但它们被设置为NOTFOUND

    我正在尝试配置whalebot带有 tar 文件的爬虫whalebot 0 02 00 tar gz 我已正确提取它 root Admin1 dls tar xvzf whalebot 0 02 00 tar gz 之后我想对其进行配置 r
  • CMake 错误“找不到要添加属性的目标”

    在我的 CMakeLIsts txt 文件中我这样写 set LIBHELLO SRC hello c set target properties hello static PROPERTIES OUTPUT NAME hello get
  • 有没有原生 DLL 导出函数查看器? [复制]

    这个问题在这里已经有答案了 是否有免费的本机 Windows DLL 导出函数查看器 它显示函数名称及其参数列表 dumpbin从 Visual Studio 命令提示符处 dumpbin exports csp dll 输出示例 Micr
  • 如何在 Visual C++ 中创建 ActiveX DLL

    是否有在 Visual Studio 2008 C 中创建 ActiveX DLL 的教程 参考 我有一个使用 DLLRegisterServer UnregisterServer 构建的 DLL 并且已注册 但我在弄清楚使用什么名称来引用
  • 如何使用 DLL 来模拟静态库的“应用程序内全局变量的多个实例”行为?

    我们有一个用 C C 编写的应用程序 它被分解为单个 EXE 和多个 DLL 这些 DLL 中的每一个都使用相同的静态库 utilities lib 实用程序静态库中的任何全局变量实际上在应用程序内运行时都会有多个实例 每个模块 即 DLL
  • Inno Setup 无法导入 DLL

    我没有运气将 Delphi DLL 导入 Inno Setup Unicode 该DLL有一个简单的过程 procedure Foo stdcall begin end exports Foo 该 DLL 包含在安装程序源中 并添加到文件列
  • M1 MacBook Pro 和 cmake 的编译错误

    我刚刚拿到了新的 M1 MacBook Pro 正在尝试编译大学工作所需的代码库 以下是我已采取的步骤 我使用 Rosetta 将终端设置为始终打开 安装的自制程序using bin bash c curl fsSL https raw g
  • 编辑 CMakeLists.txt 以使用 -fPIC 进行编译

    我正在尝试为名为 libnifalcon 的 NOVINT Falcon 安装驱动程序 我使用 cmake 创建 make 文件 但是当我运行 make 时出现错误 Linking CXX shared library lib libnif
  • CMake 占位符如何工作?

    在 CMake 的支持库中 您将看到如下所示的命令定义 set CMAKE ASM ASM DIALECT COMPILE OBJECT
  • 如何在Java程序中调用DLL中的方法

    我正在尝试使用 JNA 调用 DLL 中的方法 到目前为止已经使用加载了DLL Runtime getRuntime load myworkspace test dll 该 dll 包含我需要访问的方法 如何在我的 Java 文件中执行 D
  • Java + JNA:找不到指定的过程

    我正在尝试使用 Visual Studio 创建一个 dll 文件并在 java 项目中使用 访问它 该库似乎已加载 但总是抛出相同的异常 线程 main 中出现异常 java lang UnsatisfiedLinkError 查找函数
  • 设置 CMake OBJECT 库的输出目录

    在我的 CMake 文件中 我指定了一个对象库 add library core OBJECT sourcefiles 我在共享库中进一步引用了这组目标文件 add library sharedlib SHARED
  • 由于 MSVCR110.dll,MS Visual Studio 2012 Ultimate 无法启动

    当我尝试运行 MVS 2012 时 我总是收到错误 在库 DLL MSVCR110 dll 中找不到过程 crtCreateSymbolicLinkW 的入口点 我已经从我的另一台计算机复制了这个 dll 文件 一切正常 但没有帮助0 o
  • CMake 错误:CMake 无法找到与“MinGW Makefiles”对应的构建程序

    我正在尝试使用 cmake 为 c 构建 Box2D 库 当我运行 cmake gui 时出现错误 CMake Error CMake was unable to find a build program corresponding to
  • 在 HP Load Runner 的 VuGen 中加载 javai.dll 时出现错误

    当我尝试在 HP load runner 的 VuGen 中编译一个简单的脚本时 无法启动 JVM 并出现以下错误 Java VM Internal Error Getting Error Loading javai dll 我在用着 HP

随机推荐