【问题标题】:Adding a dll to CMake将 dll 添加到 CMake
【发布时间】:2018-09-10 10:32:20
【问题描述】:

我正在尝试向我的 CLion 项目添加一个名为 OpenAlpr 的外部库,其中包含 alpr.h 和 openalpr.lib/openalpr.dll 文件。我将头文件放在我的项目目录中并将其包含在源代码中,但我不知道如何添加 .dll 或 .lib 文件。我查看了其他答案,例如 thisthis,但它们对我来说太混乱了,我无法让我的工作;当我尝试运行时输出以下错误:

undefined reference to `alpr::Alpr::Alpr(std::string, std::string, std::string)'
.text+0x9f): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `alpr::Alpr::Alpr(std::string, std::string, st
 undefined reference to `alpr::Alpr::getVersion()'
(.text+0xf3): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `alpr::Alpr::getVersion()'
undefined reference to `alpr::Alpr::~Alpr()'
.text+0x123): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `alpr::Alpr::~Alpr()'
undefined reference to `alpr::Alpr::~Alpr()'
.text+0x1af): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `alpr::Alpr::~Alpr()'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/AlprCpp.dir/build.make:84: AlprCpp.exe] Error 1
make[2]: *** [CMakeFiles/Makefile2:73: CMakeFiles/AlprCpp.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/AlprCpp.dir/rule] Error 2
make: *** [Makefile:118: AlprCpp] Error 2

这些是我的 CMake 文件的内容:

cmake_minimum_required(VERSION 3.12)
project(AlprCpp)

set(CMAKE_CXX_STANDARD 14)

add_executable(AlprCpp main.cpp alpr.h)
link_directories(C:\\Projects\\AlprCpp)
find_library(AlprCpp openalpr.lib)

提前致谢。

【问题讨论】:

  • 实际上找到lib很棒但是它需要var名称而不是目标。请参阅:cmake.org/cmake/help/v3.0/command/find_library.html 你应该这样称呼它 Find_library(OpenALPR_LIBS openalpr.lib) 它将库路径存储在 OpenALPR_LIBS 然后你必须链接到与 target_link_libraries。见cmake.org/cmake/help/v3.0/command/…有了这个你应该可以编译了。
  • 但是由于缺少 dll,它会在运行时崩溃,您现在应该将其复制到可执行路径或设置 RPATH 或将 dll 路径添加到 PATH env。如果您需要更详细的答案,请告诉我

标签: cmake clion


【解决方案1】:

不要将库的头文件复制到项目中。

在某些时候,您需要认真阅读教程并学习如何使用 find_package。如果您只是想让事情快速运行,这是一种简单的方法(假设文件名为 Alpr.lib Alpr.h)。

cmake_minimum_required(VERSION 3.12)
project(AlprCpp)

set(ALPR_LIBRARY "" CACHE FILEPATH  "Full path to Alpr.lib")
set(ALPR_INCLUDE_PATH "" CACHE PATH "Directory containing Alpr.h")
include_directories(${ALPR_INCLUDE_PATH})

add_executable(AlprCpp main.cpp)
target_link_libraries(AlprCpp ${ALPR_LIBRARY })

对于dll文件(假设是Windows),要么设置PATH环境变量,要么将DLL复制到.exe所在目录。

【讨论】:

  • 我尝试了你的建议,但输出同样的错误。
  • 您是否在 cmake 中设置了 ALPR_LIBRARY 和 ALPR_INCLUDE_PATH ?您还可以发布早期的输出,例如“未定义的引用到 ...”,以准确找出未定义的函数。我对Alpr不熟悉,.lib文件不止一个吗?
  • 我添加了输出的前面部分。它给出了头文件中所有函数的错误,说它们是未定义的。该库还有一些其他 .lib 文件,我将它们都放在同一个 INCLUDE_DIRECTORY 中。
  • 您的问题与#include 和头文件无关,与链接器有关。您必须链接使用的 所有 .lib 文件。它也与“.dll”文件无关,因为那是运行时的事情。我刚刚查看了 OpenAlpr,它太复杂了,无法像我建议的那样手动工作。请熟悉 CMake 的 find_package。
猜你喜欢
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多