Qt Creator 找不到具有自定义 cmake 步骤的库

Qt Creator cannot find library with custom cmake step

本文关键字:cmake 自定义 Creator 找不到 Qt      更新时间:2023-10-16

在Qt Creator(版本3.0.1,Qt版本5.2.1)中,我做了一个自定义cmake步骤(而不是qmake),使用以下CMakeLists.txt文件:

cmake_minimum_required (VERSION 2.8)
add_executable (myapp source.cpp)
target_link_libraries(myapp dl)

在我的source.cpp文件中,我有以下代码:

#include <dlfcn.h>
int main()
{
    dlopen("mylibrary.so", RTLD_NOW|RTLD_GLOBAL);
    return 0;
}

mylibrary.so位于/usr/lib

当我使用cmake编译它并从命令行make时,它会按预期编译。但是,如果我尝试在Qt Creator中构建它,我会收到以下错误:

undefined reference to `dlopen'

这表明Qt Creator不知道去哪里寻找libdl.so,这是/usr/lib/x86_64-linux-gnu

所以我的问题是:为什么从命令行运行cmakemake有效,而在Qt Creator中构建不起作用?我如何告诉Qt Creator在哪里搜索libdl.so

首先,你应该在Qt软件中使用QLibrary来处理动态加载、查找等。你也会省去你现在看到的麻烦。

其次,你可以使用它,但它有点硬连线的东西,诚然:

target_link_libraries(myapp /usr/lib/x86_64-linux-gnu/libdl.so)

第三,更好的方法是为此使用一些查找模块,如下所示:

# - Find libdl
# Find the native LIBDL includes and library
#
# LIBDL_INCLUDE_DIR - where to find dlfcn.h, etc.
# LIBDL_LIBRARIES - List of libraries when using libdl.
# LIBDL_FOUND - True if libdl found.
IF (LIBDL_INCLUDE_DIR)
# Already in cache, be silent
SET(LIBDL_FIND_QUIETLY TRUE)
ENDIF (LIBDL_INCLUDE_DIR)
FIND_PATH(LIBDL_INCLUDE_DIR dlfcn.h)
SET(LIBDL_NAMES dl libdl ltdl libltdl)
FIND_LIBRARY(LIBDL_LIBRARY NAMES ${LIBDL_NAMES} )
# handle the QUIETLY and REQUIRED arguments and set LIBDL_FOUND to TRUE if
# all listed variables are TRUE
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibDL DEFAULT_MSG LIBDL_LIBRARY LIBDL_INCLUDE_DIR)
IF(LIBDL_FOUND)
SET( LIBDL_LIBRARIES ${LIBDL_LIBRARY} )
ELSE(LIBDL_FOUND)
SET( LIBDL_LIBRARIES )
ENDIF(LIBDL_FOUND)
MARK_AS_ADVANCED( LIBDL_LIBRARY LIBDL_INCLUDE_DIR )

然后,鉴于您在 cmake 模块路径中有它,您可以按如下方式找到它:

find_package(LIBDL REQUIRED)